2. Qu’est ce que PL/Python
Plpython est language de procédure qui permet d’écrire des fonctions
postgresql en python.
Il en existe d’autre comme plpgsql, plperl,...
Et voilà!
2
3. Installation
Simplement executer dans la console postgresql:
CREATE LANGUAGE plpythonu;
Et PL/Python est maintenant disponible comme language procédural
dans postgesql.
3
4. Création d’une fonction
Hello world en plpython:
CREATE FUNCTION hello_world()
RETURNS varchar
AS $$
return ‘Hello world’
$$ LANGUAGE plpythonu;
Elle est alors accessible en postgresql:
select hello_world();
Pour supprimer une fonction (attention aux parenthèses):
drop function hello_world()
4
5. éditer une fonction
Voir le contenu d une fonction:
SELECT prosrc FROM pg_proc WHERE proname=’hello_world’;
Ainsi nous pouvons modifier le contenu de la fonction:
UPDATE pg_proc
SET prosrc = ‘return «hello world2»’
WHERE proname = ’hello_world’;
5
6. Triggers
Un exemple d’utilisation de ces fonctions est dans les triggers SQL.
Ainsi on peut décider d’executer une fonction avant ou après un update, insert, ...
Exemple d’une fonction plus complexe
CREATE FUNCTION validate_birthedanimal()
RETURNS trigger
AS $$
animal = TD[‘new’][‘animal_pk’]
select_animal = plpy.prepare(»»»
SELECT birthedanimal_pk, operation_isvalid
FROM birthedanimal, declarationnaissance, operation
WHERE animal_pk = ‘%s’
AND declarationnaissance_naiss_pk = naiss_pk
AND operation_operation_id = operation_id
AND operation_isvalid = true»»» % animal)
result_animal = plpy.execute(select_animal)
if len(result_animal) > 1:
raise plpy.error(‘Key %s already exist’ % animal)
$$ LANGUAGE plpythonu;
6
7. Enregistrement du trigger
Attention le CONSTRAINT est tres important, car il permet l execution du trigger au
moment du commit de la transaction, empeche ainsi de passer outre la verification
si 2 transaction sont envoyées au meme moment.
Enregistrement du trigger
CREATE CONSTRAINT TRIGGER insert_update_birthedanimal
AFTER INSERT OR UPDATE ON birthedanimal
FOR EACH ROW EXECUTE PROCEDURE validate_birthedanimal();
7
8. Variables utiles
Vous pouvez acceder a certaines variables dont la plus utile est
TD[‘new’] qui renvoie la ligne qui va etre inseree.
TD[‘when’] peut être utile aussi, ça contient la variable de moment
d’execution du trigger, c’est à dire que si on a enregistré le trigger pour
qu’il s execute avant (BEFORE) une insertion, TD[‘when’] sera égal à
‘BEFORE’.
Ainsi on peut créer des condition du genre:
moment = TD[‘when’]
select_inventaire_occ = plpy.prepare(...)
result_inventaire_occ = plpy.execute(select_inventaire_occ)
if (moment == ‘BEFORE’ and result_inventaire_occ):
raise plpy.error(‘Key %s %s already exist’ % (numTroupeau, dateYear))
elif (moment == ‘AFTER’ and len(result_inventaire_occ) > 1):
raise plpy.error(‘Key %s %s already exist’ % (numTroupeau, dateYear))
8
9. Variables utiles (suite)
En ayant enregistré les triggers ainsi:
CREATE TRIGGER insert_inventaire_occ
BEFORE INSERT ON inventaire_occ
FOR EACH ROW EXECUTE PROCEDURE validate_inventaire_occ();
CREATE TRIGGER update_inventaire_occ
AFTER UPDATE ON inventaire_occ
FOR EACH ROW EXECUTE PROCEDURE validate_inventaire_occ();
9