Создание 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();
Здесь все как обычно.
Собственно все, можно использовать триггер.
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();
Здесь все как обычно.
Собственно все, можно использовать триггер.
Comments
Comment form for «Создание Postgresql trigger на PL/Python»