miércoles, 26 de marzo de 2014
Postgres - Triggers invocando a función Python - Ejemplo
Dadas las siguientes tablas:
create table t3 (id int, name varchar);
create table t4 (id int, name varchar);
Con la función en python:
create or replace function py_addpar()
returns trigger as $$
if int(TD['new']['id'])%2 == 0:
sql = plpy.prepare(""" INSERT INTO t4 (id, name) values ($1, $2); """, ("INTEGER", "TEXT",))
ss = plpy.execute(sql, (TD['new']['id'], TD['new']['name'],))
$$ language plpython2u;
y el trigger que lo invoca:
create trigger tr_add
after insert
on t3
for each row
execute procedure py_addpar();
Verificando:
insert into t3 (id, name) values (1, 'uno');
insert into t3 (id, name) values (2, 'dos');
select * from t4 ;
visualizará:
id | name
------+-----------
2 | 'dos'
Es decir el trigger ejecuta la función py_addpar que adiciona en la tabla t4 los valores de la tabla t3 si es que el campo id es par.
Consideraciones:
El lenguaje PL/Python importa automáticamente el módulo plpy. que proporciona dos funciones (execute y prepare). Llamando con plpy.execute con un string de consulta (query) y el argumento (limit) opcional retorna en un objeto resultado. La segunda función "prepare" prepara la ejecución, es llamado con un string de consulta y una lista de tipos de parámetro.
A diferencia de las funciones invocadas en plpgsql, los valores enviados como parámetros se encuentran en el diccionario [TD] (http://www.postgresql.org/docs/9.1/static/plpython-trigger.html)
Los valores de los parámetros deben ser previamente convertidos (cast) al tipo de dato que corresponde, Ejm: int(TD['new']['id'])
Ahora con PL/PGSql:
El siguiente código realiza lo mismo con la única diferencia que utiliza el lenguaje PL/PGSql:
Función:
create or replace function py_addpar()
returns trigger as $$
BEGIN
if NEW.id % 2 = 0 then
insert into t4 (id, name) values (NEW.id, NEW.name);
end if;
return NULL;
END;
$$ language plpgsql;
Suscribirse a:
Comentarios de la entrada (Atom)
No hay comentarios.:
Publicar un comentario