About |

Создание Postgresql trigger на PL/Python

PostgreSQL отличная и функциональная база данных. Одна из замечательных вещей, которых она поддерживает это создание функций на разных языках программирования ( PL/pgSQL, PL/Tcl, PL/Perl, PL/Python), а не только PL/SQL как большинство СУБД. В этом посте я приведу пример функции для триггера на PL/Python.

Для использования питона необходимо установить соотвествующий пакет.
Пример для debian:
    sudo apt-get install postgresql-plpython
И выполнить 
    createlang plpythonu <dbname>
где <dbname> имя вашей базы данных.
Вот пример функции для триггера из реального проекта (упрощенный).

    CREATE or REPLACE FUNCTION  business_update_price() RETURNS trigger AS
    import re
    repl = re.compile(r”[ a-zA-Z&$£€,]+”)
    def to_int(value):
        if value is None or value==”“:
            return -1
        i,j = re.subn(repl, “”, value)
        try:
            i=int(i)
        except ValueError:
            i=-1
        return i
    
    TD[“new”][“price_from_i”] =
to_int(TD[“new”][“price_from”])
   
    return “MODIFY
    ‘ LANGUAGE plpythonu;
   


Данная функция вырезает нежелательные элементы из поля price_from и пытается привести поле к типу INT. Сохряняет -1 если перекодировка не удалась. Как можно видеть функция представляет собой обычный питон-скрипт, что может быть очень удобно.
В случае если функция работает как триггер в нее передается словарь TD.
Строки триггера хранятся в TD[“new”] и/или TD[“old”] в зависимости от TD[“event”], который содержит событие в виде строки (INSERT, UPDATE, DELETE, or UNKNOWN). TD[“when”] содержит одну из следующих строк — BEFORE, AFTER, или UNKNOWN. TD[“level”] содержит одно из следующих значений -  ROW, STATEMENT, или UNKNOWN. TD[“name”] содержит имя триггера, и TD[“relid”] содержит OID таблицы на которой сработал триггер. Если вы передаете агрументы при создании триггера (CREATE TRIGGER ) они будут доступны в TD[“args”][0]TD[“args”][(n-1)].

Итак мы создали тело триггера (функцию), теперь создадим сам триггер.

    CREATE TRIGGER t_business_ui before update or insert on search_business
       FOR EACH ROW EXECUTE PROCEDURE business_update_price();


Здесь все как обычно.
Собственно все, можно использовать триггер.

Add post to: Delicious Reddit Slashdot Digg Technorati Google
(already: 2) Comment post

Comments

No comments for this post

Comment form for «Создание Postgresql trigger на PL/Python»

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image