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;












No hay comentarios.:

Publicar un comentario