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

PostgreSQL 13 Python 3.7.9 plpython3u:“psql:server意外地关闭了连接。”应用程序已失去数据库连接。'

汤兴生
2023-03-14

我已经添加了我能找到的所有细节,所有的链接,似乎没有办法让plpython3u在PostgreSQL 13中的Windows上工作。

旧的,因为接受的答案显示v3。7.0解决了这个问题: 最好不要通读这个长问题,而是直接跳到答案:当你需要plpython3u时不要使用Windows PostgreSQL。这个问题已经讨论得够久了,看不到解决办法

也许更高版本的PostgreSQL可以解决这个问题,那么请回答。

这是从

无法“安装”plpython3u-postgresql及其所有注释

来自

当我试图用plpython3u[WIN10,pgAdmin4 3.5]创建函数时,PosgreSQL 11失去了连接。

我已经采取了这些步骤,这些步骤完全分散在堆栈溢出中:

如果在未安装的情况下运行使用plpython3u语言的sql,则会得到

错误:语言"plpython3u"不存在提示:使用CREATE EXTENSION将语言加载到数据库中。

SQL状态:42704

相关的:

  • 无法安装plpython3u-postgresql

错误地

错误:无法加载库“C:/Program Files(x86)/PostgreSQL/13/lib/plpython3u.dll”:找不到指定的模块。

SQL状态:58P01

查找C:\ProgramFiles\PostgreSQL\13\doc\installation notes。html查找所需的Python版本,以便为已安装的PostgreSQL版本安装。

PostgreSQL 13

安装说明

欢迎使用PostgreSQL 13安装向导。

过程语言

过程语言pl/Perl、pl/Python和pl/Tcl包含在这个PostgreSQL发行版中。服务器是使用这些语言解释器的Language agePack社区发行版构建的。要在PostgreSQL中使用这些语言中的任何一种,请下载并安装适当的解释器,并确保它们包含在启动数据库服务器的PATH变量中。使用的版本如下所示-较新的次要版本(错误修复)也可能有效,但尚未经过测试:

Perl 5.26
Python 3.7
Tcl 8.6

因此,需要Python 3.7。

学分分配给:

  • 无法加载库plpython3。动态链接库--

相关的:

  • 在Windows上安装plpythonu

使用Windows版Python的webinstaller安装Python版本

最新的子版本3.7.10在稳定版本列表中没有任何文件,我懒得在Windows上从源代码安装Python。v3的源代码。7.10是否可在此查找特定版本?,对于任何想尝试的人):

Python 3.7.10-2021年2月15日

请注意,Python3.7.10不能在Windows XP或更早版本上使用。

No files for this release.

从如何从源代码构建Python 3.4.6复制的说明?

Python3.7分支处于仅安全修复模式。这意味着此分支上只接受安全修复,不再接受非关键错误修复。此分支上的新版本仅限于源代码,不提供二进制文件。

见官方公告。

如果您确实需要用于windows的python 3.7.10二进制文件,则必须自己编译。

无法安装plpython for postgres 12建议从源代码安装特定版本:

你想使用特定的python版本

再次,因为我是懒惰的,我采取最近的稳定版本3.7,这是子版本3.7.9,这应该是没有问题的评论,因为你似乎可以自由选择子版本:

尝试版本python-3.4.0.amd64的Windows 64位或其他版本从这个Python 3.4.0下载链接

发件人:无法加载库plpython3。动态链接库

正如我所说,当v3.7.9可用时,我懒得在Windows上编译v3.7.10的二进制文件,因此:

Python 3.7.9-2020年8月17日

请注意,Python3.7.9不能在Windows XP或更早版本上使用。

Download Windows help file
Download Windows x86-64 embeddable zip file
Download Windows x86-64 executable installer
Download Windows x86-64 web-based installer
Download Windows x86 embeddable zip file
Download Windows x86 executable installer
Download Windows x86 web-based installer

我安装“下载视窗x86-64基于网络的安装程序”(侧记:你不能改变安装路径,他们似乎强迫你使用这个;为了快速到达它,在视窗资源管理器中,键入路径%appdata%-

用户环境变量“PATH”中将有一个新条目,您可以对此进行检查,但无需:

C:\Users\MY_USER\AppData\Local\Programs\Python\Python37\Scripts\

C:\Users\MY_USER\AppData\Local\Programs\Python\Python37\

学分分配给:

  • 无法加载库plpython3。dll,于2018年1月31日回复

执行时

CREATE EXTENSION plpython3u;

在PostgreSQL pgAdmin4的查询工具中,我得到一个错误:

无法加载库"C:/Program Files/PostgreSQL/13/lib/plpython3u.dll":找不到指定的模块

在我的例子中,转到Python3.7安装文件夹

C:\Users\MY_USER\AppData\Local\Programs\Python\Python37

然后将“python37.dll”从那里复制到

C:\Windows\System32

通过确认您拥有管理员权限。

现在再次执行,它将工作:

CREATE EXTENSION plpython3u;

学分分配给:

  • 创建扩展plpython3u时出错;在PostgreSQL 9.6.0上,于2017年9月18日回复

相关问题:

  • PostgreSQL无法创建plpythonu扩展
SELECT * FROM pg_extension;

输出:

old    | extname       | extowner | extrelocatable | extversion | extversion | extconfig | extcondition
"13428"| "plpgsql"     | "10"     | "11"           | false      | "1.0"      | [null]    | [null]
"16776"| "plpython3u"  | "10"     | "11"           | false      | "1.0"      | [null]    | [null]

另一张支票:

SELECT * FROM pg_language;

输出:

  lanname   | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl
------------+----------+---------+--------------+---------------+-----------+--------------+--------
 internal   |       10 | f       | f            |             0 |         0 |         2246 |
 c          |       10 | f       | f            |             0 |         0 |         2247 |
 sql        |       10 | f       | t            |             0 |         0 |         2248 |
 plpgsql    |       10 | t       | t            |         12279 |     12280 |        12281 |
 plpython3u |       10 | t       | f            |         40963 |     40964 |        40965 |
(5 rows)

现在可用的扩展(即所有可能安装的扩展)也显示了plpython3u扩展的installed_version=1.0

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

输出:

或在psql中运行相同时的输出:

    name    | default_version | installed_version |                  comment
------------+-----------------+-------------------+-------------------------------------------
 plpython3u | 1.0             | 1.0               | PL/Python3U untrusted procedural language
(1 Zeile)

我们在这里看到可能是最近没有提供plpython扩展的图像的主要原因之一:PL/Python3U不可信的过程语言

和另一个显示相同内容的查询:

SELECT * FROM pg_pltemplate;

输出:

  tmplname  | tmpltrusted | tmpldbacreate |      tmplhandler       |        tmplinline        |    tmplvalidator    |    tmpllibrary    | tmplacl
------------+-------------+---------------+------------------------+--------------------------+---------------------+-------------------+---------
 plpgsql    | t           | t             | plpgsql_call_handler   | plpgsql_inline_handler   | plpgsql_validator   | $libdir/plpgsql   |
 pltcl      | t           | t             | pltcl_call_handler     |                          |                     | $libdir/pltcl     |
 pltclu     | f           | f             | pltclu_call_handler    |                          |                     | $libdir/pltcl     |
 plperl     | t           | t             | plperl_call_handler    | plperl_inline_handler    | plperl_validator    | $libdir/plperl    |
 plperlu    | f           | f             | plperlu_call_handler   | plperlu_inline_handler   | plperlu_validator   | $libdir/plperl    |
 plpythonu  | f           | f             | plpython_call_handler  | plpython_inline_handler  | plpython_validator  | $libdir/plpython2 |
 plpython2u | f           | f             | plpython2_call_handler | plpython2_inline_handler | plpython2_validator | $libdir/plpython2 |
 plpython3u | f           | f             | plpython3_call_handler | plpython3_inline_handler | plpython3_validator | $libdir/plpython3 |
(8 rows)

对于plpython扩展,我们在tmpltrusted列中看到False,在tmpdbacreate列中看到False,而三个受信任扩展“plpgsql”、“pltcl”和“plperl”在同一列中是True

学分分配给:

  • 使用psql如何列出数据库中安装的扩展
  • PostgreSQL:如何安装plpythonu扩展
  • 从PostgreSQL函数运行python脚本
  • 无法“安装”plpython3u-postgresql,于20年6月9日发表评论

现在运行一个通用测试查询,如下所示:

CREATE OR REPLACE FUNCTION return_version()
  RETURNS VARCHAR
AS $$
    import sys
    return sys.version
$$ LANGUAGE plpython3u;

如果这起作用,您将能够运行SQL查询选择return\u version()并获取

输出:

CREATE FUNCTION

测试:

postgres=# SELECT return_version();
              return_version
------------------------------------------
 3.8.10 (default, Jun  2 2021, 10:49:15) +
 [GCC 9.4.0]
(1 row)

当然,我们看不到这一点,否则问题就会解决。这将是3.7.9在本例中,我使用了plpython3u工作的Linux安装,请参见答案中的Linux提示。

旁注:加载模块的更复杂测试

通常,您可以忽略第二个测试,并在return\u version()函数测试处停止。

当然,如果创建函数return_version()失败,下面的也会失败。这第二个测试只是为了检查你是否也可以加载模块尽快plpython3u可以使用。在这种情况下,您需要安装所需的Python包,这些包必须与Python 3.7兼容。似乎必须使用pip而不是conda,因为Python应该从官网链接下载。为了避免依赖冲突,最好使用诗歌作为包管理器(类似于conda,仅用于pip)。

在PostgreSQL中执行机器学习的这个PostgreSQL查询时第1部分: K意味着聚类,使用语言plpython3u(需要的包“熊猫”和“skLearning”安装在Python3.7的基础环境中,也就是说,没有使用虚拟环境来避免未解决的Can python venv与plpython3u一起用于postgreql?,这绝对不是我所期望的像PostgreSQL这样的标准设置程序):

CREATE OR replace FUNCTION kmeans(input_table text, columns text[], clus_num int) RETURNS bytea AS
 
$$
 
from pandas import DataFrame
from sklearn.cluster import KMeans
from pickle import dumps
 
all_columns = ",".join(columns)
if all_columns == "":
    all_columns = "*"
 
rv = plpy.execute('SELECT %s FROM %s;' % (all_columns, plpy.quote_ident(input_table)))
 
frame = []
 
for i in rv:
    frame.append(i)
df = DataFrame(frame).astype('float')
kmeans = KMeans(n_clusters=clus_num, random_state=0).fit(df._get_numeric_data())
return dumps(kmeans)
 
$$ LANGUAGE plpython3u;

旁注结束

任何使用语言plpython3u的测试查询都会导致错误:

ERROR: server closed the connection unexpectedly

This probably means the server terminated abnormally before or while processing the request.

当我在这之后运行另一个查询时,它会运行,但是在单击“继续”之前,我会得到:

The application has lost the database connection.

- If the connection was idle, it may have been forcibly disconnected.
- The application server or database server may have been restarted.
- The user session may have timed out.

Do you want to continue and establish a new session?

当我试图用plpython3u[WIN10,pgAdmin4 3.5]创建函数时,PosgreSQL 11线程失去连接可能会解决这个问题。这样的答案表明v3的子版本。7.9或v3。7.10或其他可能真的很重要!我是否需要从源代码处安装版本3.7.10才能获得最新版本?

我不想为了验证这一点而从源代码安装Python3.7.10。谁说从v3开始改变。6.5到v3。6.7真的在上面的链接中解决了这个问题,而且它不是仅仅因为一个新的安装就发生了什么?

我也可以试试v3。7.0.

Python 3.7.0-六月27,2018

请注意,Python3.7.0不能在Windows XP或更早版本上使用。

Download Windows help file
Download Windows x86-64 embeddable zip file
Download Windows x86-64 executable installer
Download Windows x86-64 web-based installer
Download Windows x86 embeddable zip file
Download Windows x86 executable installer
Download Windows x86 web-based installer

但是,由于v3.6.7版本似乎曾经工作过,我看不出有什么理由我应该投资于此。

学分分配给:

  • PosgreSQL 11在我尝试使用plpython3u[WIN10,pgAdmin4 3.5]创建函数时丢失了连接,于2018年11月25日回答

相关的:

  • psql:服务器意外地关闭了连接

EDB和Stack Builder是PostgreSQL网站推荐的安装方法。我在无法为postgres 12安装plpython时发现了这一点(该线程只处理无法创建扩展的问题,因此无法帮助)。我安装了PostgreSQL 10,因为plpython3u在timescaleDB Linux容器中使用它(请参阅下面的“Docker”),我希望这个较低的PostgreSQL版本能够解决这个问题。但是使用这种官方的安装方法,使用EDB,然后使用堆栈生成器作为附加的“pl/python语言包”,我仍然会得到相同的错误。

Python3.7的哪个子版本(v3.7.10、v3.7.0或其他版本;也许我的v3.7.9也已经正确了,因为可以用它创建plpython扩展)肯定与PostgreSQL13一起工作,如果不只是通过测试来发现这一点,又该如何发现呢?如果选择正确的Python子版本不是这里的问题(可能性更大),那么如何修复使用语言plpython3u时弹出的步骤5错误:

ERROR: server closed the connection unexpectedly

This probably means the server terminated abnormally before or while processing the request.

(这是psql: server的一个问题,它关闭了连接,但没有关注这个Python扩展问题)

The application has lost the database connection.

(当我试图用plpython3u[WIN10,pgAdmin4 3.5]创建函数时,这是PosgreSQL 11中的一个问题,但这意味着从源代码处安装v3.7.10只是为了拥有最新的子版本,并且我尝试找到正确的子版本或其他方法来运行它,然后再这样做)


共有2个答案

陶修洁
2023-03-14
匿名用户

最后一段并不是问题的一部分,只是列出了在Windows plpython3u安装不起作用时Linux上的一些替代步骤。

>

  • 在Windows上,安装Docker Desktop(推荐)或在WSL2上使用Docker。否则,只需直接在Linux上安装Docker。

    在Docker PostgreSQL 9.6-安装扩展plpython3u(与分位数扩展冲突)中可以找到一个典型的postgres Docker设置,您可以轻松地将其更改为最新版本。

    Docker的问题是,您需要额外的技巧,以便即使您删除容器,数据库也会保存,例如:

    • pg_dump/pb_restore/psql<代码>

    你也可以从Docker上的PostgreSQL这样的线程中第一次瞥见:如何在plpython3u下安装和运行python依赖项?,或者使用docker-comment指南作为postgres基础,通过plpython3对其进行扩展。

    在一个未能使用plpython3u的容器中,一个主要技巧是添加符号链接,而不是硬编码的安装路径,请参阅将plpython3扩展添加到Postgres/timescaledb Alpine Docker映像。这对我有用。使用这个alpine TimescaleDB Dockerfile,我可以使用plpython3u!这个容器中的这个旧Python 3.6版本的警告:我无法为上面的kmeans测试安装所需的包,这些包是pandas、scikit learn和pickle,既不使用pip,也不使用诗歌。这个包含Python 3.6的alpine容器似乎不支持pandas,而Python 3.7支持:在docker alpine中安装pandas。如果无法安装所需的软件包,plpython3u在此docker容器中没有任何价值。这就是为什么您应该使用PostgreSQL的最新Docker映像(或者例如timescaleDB),这样您就不会遇到Python 3.6依赖关系的遗留问题。

    当数据永久保存在本地变得更加重要时,您也可以尝试在独立的Linux上安装

    • 在PostgreSQL下载和PostgreSQL Wiki Apt上有Linux安装的官方指南。
    • 此链接显示如何安装扩展:PostgreSQL:如何安装plpythonu扩展,例如使用postgres 13的postgresql-plpython3-13;在9/2021,这安装了Python3.8.10。我可以确认它有效!我可以创建上面的plpython3ureturn_version()函数并运行它。如果您需要导入需要安装的包,请参见例如Linux:如何安装Python包,以便由已经工作的PostgreSQL 13 plpython3u扩展找到它?。

    随着WSL、WSL2和Docker Desktop的出现,Linux已经成为Windows的朋友。Windows似乎鼓励了这一点。在Linux上转向postgreSQL可能是最近plpython3u对Windows支持不佳的原因。同时,您应该将其安装在Linux上(独立或Docker容器中)。

    但是Windows安装有什么问题吗?

    >

  • 如前所述,Windows没有得到Linux得到的PostgreSQL关注。我想在Windows上,我必须从源代码安装PostgreSQL,以及plpython扩展及其依赖项,以使plpython3u正常运行。

    也许,仅仅因为技术细节,普通的Windows安装程序也不支持plpython:上面问题中的查询显示:PL/Python3U untrusted procedural language。通常的生产系统可能不允许这样做。例如,Web服务器服务TimescaleForge(timescaleDB,基于PostgreSQL)回答说,由于存在安全风险,即使客户机要求,他们也不提供任何plpython扩展。相反,它们为明确的问题提供了可信的扩展,而不是一种可以做任何事情的完整语言,因此存在安全风险。显然,当从源代码构建时,您可以使用不受信任的扩展,就像TimescaleForge使用它们自己的扩展一样。

    当在plpython3u过程中导入Python包时,可能需要设置一个PATH变量,如答案中的“找不到模块”。

    也许在Windows上,Python的默认版本必须在安装之前的某个地方更改?这只是一个非常模糊的猜测,来自使用make的Linux安装,在/etc/make中使用Python设置。形态

    最后:

    当使用与上述链接的此Docker文件中使用的相同安装技巧时,plpython3u可能会在Windows上的PostgreSQL中运行,请将plpython3扩展添加到Postgres/timescaledb Alpine Docker映像,其中plpython3u工作:

    RUN set -ex \
        && apk add --no-cache --virtual .plpython3-deps --repository http://nl.alpinelinux.org/alpine/edge/testing \
        postgresql-plpython3 \
        && ln -s /usr/lib/postgresql/plpython3.so /usr/local/lib/postgresql/plpython3.so \
        && ln -s /usr/share/postgresql/extension/plpython3u.control /usr/local/share/postgresql/extension/plpython3u.control \
        && ln -s /usr/share/postgresql/extension/plpython3u--1.0.sql /usr/local/share/postgresql/extension/plpython3u--1.0.sql \
        && ln -s /usr/share/postgresql/extension/plpython3u--unpackaged--1.0.sql /usr/local/share/postgresql/extension/plpython3u--unpackaged--1.0.sql
    

    因此,。必须安装plpython3 depspostgresql-plpython3,并且必须添加符号链接。

    也许,这样的SymLink已经是Windows上的主要技巧了,尽管我不能让它在一个快速测试中与SymLink一起工作,请参阅Windows上的PostgreSQL:让“plpython3u”扩展在SymLink的帮助下运行?它被正确地删除了,因为解决方案要容易得多,请参阅另一个答案。

  • 狄玮
    2023-03-14

    我终于能够使它与Python 3.7.0一起工作。如果有人正在寻找解决方案,他们可以安装Python 3.7.0。当然,后续版本中引入的任何新版本都将不可用。我必须重构我的代码来删除f字符串。为了方便在存储过程和函数中使用Python,这是一个小小的折衷。

    PostgresSQL版本:13.4-2

    Python版本下载链接https://www.python.org/ftp/python/3.7.0/python-3.7.0-amd64.exe

     类似资料:
    • 我一直试图通过Postgre DB Server运行这个批处理文件,并运行两个不同的sql文件,如下所示: 但是问题来了,有时我会得到下面的命令query1或query2的错误: 这种情况只是偶尔发生,所以我不完全确定为什么会发生。有人能解释为什么会这样,以及这个问题是否有解决办法吗?谢谢! 更新:在实际的Postgre应用程序中尝试打开远程服务器时,我有时也会遇到相同的错误:“出现错误:”服务器

    • 问题内容: 我有些困惑,我从阅读以下内容 你不需要关闭conn连接吗?如果conn.close()没有发生,那实际上是怎么回事? 我有一个正在维护的私有Web应用程序,该应用程序当前无法关闭任何一种形式,但是重要的应用程序真的是stmt,conn还是两者兼而有之? 该站点间歇性地关闭,但是服务器一直在说这是数据库连接问题,我怀疑它没有关闭,但是我不知道该关闭哪个。 问题答案: 使用完之后,你需要通

    • 问题内容: 我正在为我的三年级项目编写应用程序。该应用程序将需要与外部mySQL数据库进行交互。该应用程序将从数据库中检索数据,并在ListView中将其显示给用户。 我对应用程序将要具有的功能有很好的了解。我也花了很多时间使用ListViews和本地SQLite数据库。我还对HttpUrlConnection类做了一些重新研究。 我只是想知道有人能为我提供更多有关如何访问此外部数据库的指导吗?

    • 我使用weblogic应用服务器和oracle数据库。我使用jdbc与oracle数据库通信。我从weblogic数据源获得连接,并向表中插入一条记录。问题是,当我想关闭连接(插入数据库后)时,我会遇到一个异常(连接已经关闭)。这是我的代码: 但是联系。close语句引发异常: 我试图避免连接。close语句(因为我教过连接是自动关闭的!!但过了一段时间,所有的连接都打开了,因此引发了一个异常)

    • 问题内容: 我正在研究将由学校使用的应用程序。每所学校将建立自己的数据库。每个学校都会为应用程序提供自己的“设置”文件。设置文件将包含创建设置文件的特定学校的数据库URL。这样一来,使用该应用程序的学生如果想连接到其他数据库,就只能加载其他设置文件。 我的问题是,如何保护用于连接数据库的用户名和密码?因此,只有应用程序具有对数据库的读写访问权限。应用程序仅具有该特定学校的读写权限吗? 如果您需要更

    • 我想用“OpenOrCreateDatabase”创建一个SQLLite数据库。问题是,我在创建一个新表时出现了一个错误。 这是我的代码: 怎么了? 多谢!