从 PostgreSQL 存储过程导入 Python 文件 [重复]

Posted

技术标签:

【中文标题】从 PostgreSQL 存储过程导入 Python 文件 [重复]【英文标题】:Importing Python file from PostgreSQL stored procedure [duplicate] 【发布时间】:2015-09-07 07:16:24 【问题描述】:

可以在 PostgreSQL 存储过程中包含 Python 代码。例如:

CREATE FUNCTION someProc()
RETURNS void AS $$
    # Some Python3 code...
$$ LANGUAGE plpython3u;

但是我怎样才能在这段代码中包含一个 python 文件呢?

在PostgreSQL中运行的Python的当前目录是这样的:

>>> os.getcwd()
... /var/lib/postgresql/9.3/main

我尝试了以下方法,效果很好:

CREATE FUNCTION someProc()
RETURNS void AS $$
    import sys
    sys.path.append("/dir/to/file")
    from python_file import pythonFunction
    # More Python code
$$ LANGUAGE plpython3u;

由于许多明显的原因,这似乎不太好。有没有更好的方法来导入 python 文件,或者只是从 python 文件中调用 python 函数?

编辑: 没有任何特定的 PostgreSQL 方法可以导入文件。但最好的方法是在下面的正确答案中,这类似于我原来的解决方案,但更好。

【问题讨论】:

【参考方案1】:

这与在独立 Python 中从文件中动态加载 Python 代码没有什么不同:

How to import a module given the full path?

PL/Python3 (untrusted) 只是嵌入在 PostgreSQL 后端进程中的 cpython 解释器,与它自己运行的操作系统用户 PostgreSQL 相同。只有很少的区别——比如线程安全——它只是 Python。

【讨论】:

谢谢,虽然我不会真的认为这是一个重复的问题,因为我是来找一个特定的 PostgreSQL 存储过程方法发现没有的,而解决方案实际上是一个更通用的 Python 方法.但再次感谢您! 当然 - 提问很有帮助,现在这个问题将在人们寻找 PL/PgSQL 时指出更一般的答案。如果我认为它是 100% 重复的,我会直接将其作为一个副本关闭而不发布答案。 啊,好吧,我以为这个问题会被删除之类的。很抱歉造成混乱,再次感谢。【参考方案2】:

您是否从文档中看到了这一点?

http://www.postgresql.org/docs/9.0/static/plpython.html

【讨论】:

嗯,是的,我查看了文档,但没有找到解决方案。 plpython 文档中的什么地方是指读取外部文件以加载 Python 代码?我认为你没有完全阅读这个问题。

以上是关于从 PostgreSQL 存储过程导入 Python 文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 11:存储过程调用错误 - 要调用过程,请使用 CALL、Java

Postgresql存储过程select into temp table。

PostgreSQL存储过程-return语句

Java 和 PostgreSQL 存储过程 - 返回注册为 out 参数,导致 in 参数出现问题

在 Java 中创建一个 bytea 数组以传递给 Postgresql 存储过程

PostgreSQL存储过程