[решено] С помощью bathman
я сталкиваюсь с "маленькой" проблемой, связанной с выполнением сценария python каждый раз, когда происходит обновление или вставка действия PostgreSQL стол. Этот скрипт будет извлекать и записывать в файл обновленные или вставленные данные.
Данные среды: Ubuntu 18.04 / PostgreSQL 10 / Python 3.6
SELECT * FROM pg_available_extensions
WHERE name LIKE '%python%' ORDER BY name;
И вывод
name | default_version | installed_version | comment
---------+--------------------------+------------------------------------------
hstore_plpython2u | 1.0 | | transform between hstore and plpython2u
hstore_plpythonu | 1.0 | | transform between hstore and plpythonu
ltree_plpython2u | 1.0 | | transform between ltree and plpython2u
ltree_plpythonu | 1.0 | | transform between ltree and plpythonu
plpython2u | 1.0 | | PL/Python2U untrusted procedural language
plpythonu | 1.0 | 1.0 | PL/PythonU untrusted procedural language
Я создал PostgreSQL функцию (надеюсь, все будет в порядке после прочтения документации)
CREATE FUNCTION getSomeData()
RETURNS trigger
AS $$
begin
import subprocess
subprocess.call(['/usr/bin/python3', '/some_folder/some_sub_folder/get_data.py'])
end;
$$
LANGUAGE plpythonu;
После этого создайте триггер
CREATE TRIGGER executePython
AFTER INSERT ON mytable
EXECUTE PROCEDURE getSomeData();
Ничего не происходит, если я делаю какую-либо вставку или обновление.
В качестве дополнительной меры предосторожности я сделал следующий тест
sudo -u postgres python3 /some_folder/some_sub_folder/get_data.py
и получил этот вывод
Traceback (most recent call last):
File "/some_folder/some_sub_folder/get_data.py", line 4, in <module>
from sqlalchemy import create_engine
ImportError: No module named sqlalchemy
Позднее редактирование
Я установил sqlalchemy globaly, и теперь мой сценарий работает, как и ожидалось, с postgres пользователем, но триггером нет.
apt install python3-sqlalchemy
Пожалуйста, помогите мне с идеей, или что-нибудь может помочь найти решение моей проблемы.
Заранее благодарен за вашу помощь.
Намного позже редактировать и решать
CREATE FUNCTION getSomeData()
RETURNS trigger
AS $$
begin
import subprocess
subprocess.call(['/path/to/your/virtual/environment/bin/python3', '/some_folder/some_sub_folder/get_data.py'])
end;
$$
LANGUAGE plpythonu;