5

我面临一个关于每次执行 Python 脚本的“小”问题是对 PostgreSQL 表的更新或插入操作。

该脚本将提取并写入文件更新或插入的数据。

环境数据:Ubuntu 18.04(Bionic Beaver)、PostgreSQL 10、Python 3.6

SELECT * FROM pg_available_extensions
WHERE name LIKE '%python%' ORDER BY name;

并输出

姓名 默认版本 安装版本 评论
hstore_plpython2u 1.0 hstore 和 plpython2u 之间的转换
hstore_plpythonu 1.0 hstore 和 plpythonu 之间的转换
ltree_plpython2u 1.0 ltree 和 plpython2u 之间的转换
ltree_plpythonu 1.0 ltree 和 plpythonu 之间的转换
plpython2u 1.0 PL/Python2U 不受信任的过程语言
plpythonu 1.0 1.0 PL/PythonU 不受信任的过程语言

我创建了一个 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,现在我的脚本可以使用postgres用户按预期运行,但它不会触发。

apt install python3-sqlalchemy
4

1 回答 1

1

Bathman提供的解决方案的指针:

当您以普通用户身份执行此操作时,您是否使用全局 python3 执行它,或者是否有机会加载 venv 或其他环境,并且您的常用用户 python3 可执行文件是您本地安装 SQLAlchemy 的 venv 的别名?您可以尝试通过 /path/to/your/environment/with/sqlalchemy/installed/bin/python3 执行或全局安装 SQLAlchemy,以便您的 /usr/bin/python3 可以访问它。

解决方案:

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;
于 2021-07-05T21:56:21.930 回答