当前位置: 首页 > 知识库问答 >
问题:

从PostgreSQL函数运行Python脚本

颜森
2023-03-14

每次在PostgreSQL表上执行更新或插入操作时,我都会遇到一个“小”问题。

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

环境数据:Ubuntu 18.04(仿生海狸)、PostgreSQL 10和Python 3.6

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

和输出

我创建了一个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

共有1个答案

东郭弘
2023-03-14

指向bathman提供的解决方案的指针:

当您像普通用户一样执行此操作时,您是使用全局python3执行它,还是有可能加载了venv或其他环境,并且您的普通用户python3可执行文件是您的venv的别名,您在本地安装了SQLAlchemy?您可以尝试通过/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;
 类似资料:
  • 问题内容: 我需要从Python脚本运行PowerShell函数。.ps1和.py文件当前都位于同一目录中。我要调用的函数在PowerShell脚本中。我看到的大多数答案都是关于从Python运行整个PowerShell脚本的。在这种情况下,我试图在Python脚本的PowerShell脚本中运行单个功能。 这是示例PowerShell脚本: 和Python脚本: 因此,我想以某种方式运行Powe

  • 问题内容: 我想从PHP运行Python脚本。该脚本的语法很好,当我从命令行运行它时,它会在它旁边生成一个图像文件。当我从命令行运行PHP文件(包含Python exec)时,它将生成一个图像文件。很好。问题是:当我使用浏览器并运行PHP时,它不会生成任何图像文件。我使用的是Xubuntu OS。 问题答案: 问题是matplotlib后端设置。我更改为“ Agg”,并且plot函数正常运行。

  • 问题内容: 当我尝试在Python 3.3中运行该代码时,该代码不执行任何操作。没有错误或任何东西。怎么了 问题答案: 您仍然必须 调用 该函数。

  • 问题内容: 之前曾在不同程度上提出过这样的问题,但我觉得还没有以简明的方式回答,因此我再次提出。 我想在Python中运行脚本。可以说是这样的: 它获取文件位置,读取它,然后打印其内容。没那么复杂。 好吧,那我该如何在C#中运行它呢? 这就是我现在所拥有的: 当我传递位置和位置无效时。有人告诉我,我应该通过的,然后作为。 我已经寻找了一段时间,只能找到建议使用IronPython或类似工具的人。但

  • 问题内容: 我的以下代码有问题: callBash.py: sleep.sh: 我希望10秒钟后打印“结束”。(我知道这是一个愚蠢的示例,我可以简单地在python中睡眠,但是这个简单的sleep.sh文件只是作为测试) 问题答案: 使sleep.sh可执行并添加到参数列表中(如先前答案中所建议)可以正常工作。根据搜索路径,您可能还需要添加或其他合适的路径。(即,更改为。) 如果bash脚本的第一

  • 这是我第一次在java中尝试python。我试图从我的代码中执行python脚本,如下所示。 但我有以下例外 无法运行程序“python”:CreateProcess error=2,系统找不到指定的文件 我已经安装了python。我不确定为什么找不到该文件。我试着跟随这个链接,但它并没有解决我的问题。 提前谢谢。 编辑1 我尝试了“Viacheslav Vedenin”给出的示例代码,当我执行我