Geo*_*ian 5 python database postgresql triggers postgresql-triggers
每次在 PostgreSQL 表上执行更新或插入操作时,我都面临一个关于执行 Python 脚本的“小”问题。
此脚本将提取更新或插入的数据并将其写入文件。
环境数据:Ubuntu 18.04(Bionic Beaver)、PostgreSQL 10、Python 3.6
SELECT * FROM pg_available_extensions
WHERE name LIKE '%python%' ORDER BY name;
Run Code Online (Sandbox Code Playgroud)
和输出
| 姓名 | 默认版本 | 安装版本 | 评论 |
|---|---|---|---|
| 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 不受信任的过程语言 | |
| 无名小卒 | 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;
Run Code Online (Sandbox Code Playgroud)
在此之后,创建触发器
CREATE TRIGGER executePython
AFTER INSERT ON mytable
EXECUTE PROCEDURE getSomeData();
Run Code Online (Sandbox Code Playgroud)
如果我进行任何插入或更新,则不会发生任何事情。
作为额外的预防措施,我做了以下测试
sudo -u postgres python3 /some_folder/some_sub_folder/get_data.py
Run Code Online (Sandbox Code Playgroud)
并得到这个输出:
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
Run Code Online (Sandbox Code Playgroud)
我已经全局安装了 SQLAlchemy,现在我的脚本按预期与postgres用户一起运行,但它不会触发。
apt install python3-sqlalchemy
Run Code Online (Sandbox Code Playgroud)
指向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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1512 次 |
| 最近记录: |