Documentation PostgreSQL 9.2.24 > Programmation serveur > PL/Python - Langage de procédures Python | |
PL/Perl sous le capot | Fonctions PL/Python |
Le langage de procédures PL/Python permet l'écriture de fonctions PostgreSQL™ avec le langage Python (mais voir aussi Section 42.1, « Python 2 et Python 3 »).
Pour installer PL/Python dans une base de données particulières, utilisez CREATE EXTENSION plpythonu. À partir de la ligne de commandes, utilisez createlang plpythonu nom_base.
Si un langage est installé dans template1, toutes les bases nouvellement créées se verront installées ce langage automatiquement.
Depuis PostgreSQL™ 7.4, PL/Python est seulement disponible en tant que langage « sans confiance » (ceci signifiant qu'il n'offre aucun moyen de restreindre ce que les utilisateurs en font). Il a donc été renommé en plpythonu. La variante de confiance plpython pourrait être de nouveau disponible dans le futur, si un nouveau mécanisme sécurisé d'exécution est développé dans Python. Le codeur d'une fonction dans PL/Python sans confiance doit faire attention à ce que cette fonction ne puisse pas être utilisée pour réaliser quelque chose qui n'est pas prévue car il sera possible de faire tout ce que peut faire un utilisateur connecté en tant qu'administrateur de la base de données. Seuls les superutilisateurs peuvent créer des fonctions dans des langages sans confiance comme plpythonu.
Les utilisateurs des paquets sources doivent activer spécifiquement la construction de PL/Python lors des étapes d'installation (référez-vous aux instructions d'installation pour plus d'informations). Les utilisateurs de paquets binaires pourront trouver PL/Python dans un paquet séparé.
PL/Python accepte à la fois les versions 2 et 3 de Python. (Les instructions d'installation de PostgreSQL peuvent contenir des informations plus précises sur les versions mineures précisément supportées de Python.) Comme les variantes Python 2 et Python 3 sont incompatibles pour certaines parties très importantes, le schéma de nommage et de transition suivant est utilisé par PL/Python pour éviter de les mixer :
Le langage PostgreSQL nommé plpython2u implémente PL/Python sur la variante Python 2 du langage.
Le langage PostgreSQL nommé plpython3u implémente PL/Python sur la variante Python 3 du langage.
Le langage nommé plpythonu implémente PL/Python suivant la variante par défaut du langage Python, qui est actuellement Python 2. (Cette valeur par défaut est indépendante de ce que toute installation locale de Python qui pourrait être considérée comme la valeur par « défaut », par exemple ce que pourrait être /usr/bin/python.) La valeur par défaut sera probablement changée avec Python 3 dans une prochaine version de PostgreSQL, suivant les progrès de la migration à Python 3 dans la communauté Python.
Cela est analogue aux recommendations de PEP 394 au regard des nommages et transitions des commandes python.
Cela dépend de la configuration lors de la compilation ou des paquets installés si PL/Python pour Python 2 ou Python 3 ou les deux sont disponibles.
La variante construite dépend de la version de Python trouvée pendant l'installation ou de la version sélectionnée explicitement en configurant la variable d'environnement PYTHON ; voir Section 15.4, « Procédure d'installation ». Pour que les deux variantes de PL/Python soient disponibles sur une installation, le répertoire des sources doit être configuré et construit deux fois.
Ceci a pour résultat la stratégie suivante d'utilisation et de migration :
Les utilisateurs existants et ceux qui ne sont pas actuellement intéressés par Python 3 utilisent le nom plpythonu et n'ont rien à changer pour l'instant. Il est recommandé de « s'assurer » graduellement de migrer le code vers Python 2.6/2.7 pour simplifier une migration éventuelle vers Python 3.
En pratique, beaucoup de fonctions PL/Python seront migrées à Python 3 avec peu, voire par du tout, de modifications.
Les utilisateurs sachant d'avance qu'ils ont du code reposant massivement sur Python 2 et ne planifient pas de changer peuvent utiliser le nom plpython2u. Cela continuera de fonctionner, y compris dans un futur lointain, jusqu'à ce que le support de Python 2 soit complètement supprimée de PostgreSQL.
Les utilisateurs qui veulent utiliser Python 3 peuvent utiliser le nom plpython3u, qui continuera à fonctionner en permanence avec les standards actuels. Dans le futur, quand Python 3 deviendra la version par défaut du langage, ils pourront supprimer le chiffre « 3 », principalement pour des raisons esthétiques.
Les intrépides qui veulent construire un système d'exploitation utilisant seulement Python-3, peuvent modifier le contenu de pg_pltemplate pour rendre plpythonu équivalent à plpython3u, en gardant en tête que cela rend leur installation incompatible avec la majorité de ce qui existe dans ce monde.
Voir aussi le document What's New In Python 3.0 pour plus d'informations sur le portage vers Python 3.
Il n'est pas permis d'utiliser PL/Python basé sur Python 2 et PL/Python basé sur Python 3 dans la même session car les symbôles dans les modules dynamiques entreraient en conflit, ce qui pourrait résulter en des arrêts brutaux du processus serveur PostgreSQL. Une vérification est ajoutée pour empêcher ce mélange de versions majeures Python dans une même sessio. Cette vérification aura pour effet d'annuler la session si une différence est détectée. Néanmoins, il est possible d'utiliser les deux variantes de PL/Python dans une même base de données à condition que ce soit dans des sessions séparées.