Запустить скрипт python из функции PostgreSQL - PullRequest
2 голосов
/ 01 мая 2020

[решено] С помощью 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...