PostgreSQL 13 + Python 3.7.9 +编译器:'psql:server意外关闭了连接,' + '应用程序已丢失数据库连接,'

xtupzzrd  于 2023-02-22  发布在  PostgreSQL
关注(0)|答案(3)|浏览(149)

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

  • 旧的,因为接受的答案显示v3.7.0解决了它:* 最好不要通读这个长问题,而是直接跳到答案:当你需要plpython3u的时候不要使用windows postgresql。这个问题已经提了很久了,还没有解决的办法。

也许更高版本的PostgreSQL Windows将解决这个问题,然后请回答。
分拆
这是从
Can't “install” plpython3u - postgresql及其所有注解
以及来自
PosgreSQL 11 lost connection when i'm trying to create function with plpython3u [WIN10, pgAdmin4 3.5].

错误步骤及迄今为止的解决方法

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

步骤0

如果在未安装plpython3u语言的情况下运行使用该语言的sql,则会得到
错误:您访问的页面不存在提示:使用CREATE EXTENSION将语言加载到数据库中。
SQL状态:42704
相关:

步骤1

出错时
错误:无法加载库"C:/Program Files(x86)/PostgreSQL/13/lib/plpython3u.dll":找不到指定的模块。
SQL状态:58P01
查找C:\Program Files\PostgreSQL\13\doc\installation-notes.html以查找要为已安装的PostgreSQL版本安装的Python版本。
PostgreSQL 13语言
安装注意事项
欢迎使用PostgreSQL 13安装向导。
程序语言
此PostgreSQL发行版中包含过程语言pl/Perl、pl/Python和pl/Tcl。服务器是使用这些语言解释器的LanguagePack社区发行版构建的。要在PostgreSQL中使用这些语言中的任何一种,下载及安装适当的解译器,并确保该等解译器已包括在启动资料库伺服器的路径变数内。所使用的解译器版本如下-较新的次要(错误修复)版本也可以工作,但尚未经过测试:

Perl 5.26
Python 3.7
Tcl 8.6

因此,需要Python 3.7。
学分授予:

相关:

步骤2

使用Python Releases for Windows的webinstaller安装Python版本
最新的子版本3.7.10在稳定版本列表中没有任何文件,我懒得在Windows上从源代码安装Python。v3.7.10的源代码可以在Looking for a specific release?中找到,任何想尝试的人都可以试试):
Python 3.7.10 - 2021年2月15日
注意,Python 3.7.10不能在Windows XP或更早版本上使用。

No files for this release.

说明复制自How to build Python 3.4.6 from source?
Python 3.7分支处于仅安全修复模式。这意味着该分支只接受安全修复,不再接受非关键bug修复。该分支上的新发行版仅提供源代码,不提供二进制文件。
See the official announcement.
如果你真的需要一个python3.7.10的windows二进制文件,你必须自己编译它。
Cannot install plpython for postgres 12建议从源代码安装特定版本:
你想使用一个特定的python版本〉使用源代码并编译它
同样,因为我比较懒,所以我选择了3.7最新的稳定版本,也就是子版本3.7.9,这应该没有问题,因为您似乎可以自由选择子版本:
请从该Python 3.4.0下载链接尝试用于64位Windows的python-3.4.0.amd64版本或其他版本
出发地:could not load library plpython3.dll
正如我所说,我太懒了,当v3.7.9可用时,我不想在Windows上编译v3.7.10的二进制文件,因此:
Python 3.7.9 - 2020年8月17日
注意,Python 3.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

我安装了"下载Windows x86 - 64基于Web的安装程序"(旁注:你不能改变安装路径,他们似乎强迫你使用这个;要快速到达它,在Windows资源管理器中,键入路径% appdata %--〉转到父文件夹"appdata"--〉然后转到"local"--〉"programs"--〉"python"以快速到达那里),并选中添加PATH变量的框。
用户环境变量"PATH"中将有一个新条目,您可以选中它,但不需要:

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

以及

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

学分授予:

步骤3

执行时

CREATE EXTENSION plpython3u;

在PostgreSQL pgAdmin4的查询工具中,我得到错误:
无法加载库"C:/Program Files/PostgreSQL/13/lib/plpython3u.dll":找不到指定的模块
在我的示例中,转到Python 3.7安装文件夹

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

并将"python37.dll"复制到

C:\Windows\System32

确认您具有管理员权限。
现在再次执行,它将工作:

CREATE EXTENSION plpython3u;

学分授予:

相关问题:

步骤4(可选)

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)

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

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 untrusted procedural language.
另一个查询显示相同的内容:

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
学分授予:

步骤5

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

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

如果这起作用,您将能够运行SQL查询SELECT return_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_version()功能测试。**

当然,如果创建函数return_version()失败,那么下面的测试也会失败,第二个测试只是为了检查是否可以在plpython3u可用时加载模块,需要安装所需的Python包,这些包必须与Python 3.7兼容。在这种情况下,似乎必须使用pip而不是conda,因为Python是要从官方网站下载的。为了避免依赖冲突,使用Poetry作为软件包管理器(类似于conda,只用于pip)可能是很好的。
当执行Machine Learning in PostgreSQL Part 1: Kmeans clustering的这个PostgreSQL查询时,使用语言plpython3u(所需的包"panda"和"sklearn"安装在Python3. 7的基础环境中,即没有使用虚拟环境来避免未解出的Can python venv be used with plpython3u for postgresql?,这绝对不是我所期望的像PostgreSQL这样的标准setter):

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;
  • 旁注结束 *

任何使用LANGUAGE 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?

这个问题可以通过线程PosgreSQL 11 lost connection when i'm trying to create function with plpython3u [WIN10, pgAdmin4 3.5]来解决。这样的答案表明**v3.7.9或v3.7.10或其他版本的子版本确实很重要!**我需要从源代码安装版本3.7.10才能拥有最新版本吗?
我不想花精力从源代码安装Python 3.7.10,只是为了检查一下,谁说从v3.6.5到v3.6.7的改变真的解决了上面链接中的问题,而不是仅仅因为一个新的安装而发生了什么?
我也可以试用v3.7.0。
Python 3.7.0 - 2018年6月27日发布
注意,Python 3.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似乎曾经工作过,我看不出有什么理由我应该投资到这一点。
学分授予:

相关:

使用EDB和Stack Builder进行Windows安装

EDB和Stack Builder是PostgreSQL网站推荐的安装方法,我在Cannot install plpython for postgres 12上找到了这个(一个线程,它只是处理根本无法创建扩展,因此无法提供帮助)。我安装了PostgreSQL 10,因为plpython3u在timescaleDB Linux容器中使用它(见下面的"Docker"),我希望这个较低的PostgreSQL版本能解决这个问题。但是使用这个官方的安装方法,使用EDB,然后使用Stack Builder进行额外的"pl/python语言包",我仍然得到同样的错误。

问题

Python 3.7的哪个子版本(v3.7.10、v3.7.0或其他版本;也许我的v3.7.9也是正确的,因为plpython扩展可以用它来创建)肯定可以与PostgreSQL 13一起工作,如果不只是通过测试,如何才能发现这一点?如果选择正确的Python子版本不是这里的问题(这是更可能的),我还可以如何修复使用LANGUAGE plpython3u时弹出的步骤5错误:

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.
  • (这是一个问题,在PosgreSQL 11失去了连接,当我试图创建函数与plpython3u [WIN10,pgAdmin4 3.5],但将意味着安装v3.7.10从源只有最新的子版本,我试图找出正确的子版本或其他技巧,让它运行之前这样做)*
t9aqgxwy

t9aqgxwy1#

适用于Windows和Postgres的变通方法13

我终于能够让它在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

ycl3bljg

ycl3bljg2#

解决方法:plpython3u确实可以在Linux上工作!所以在Linux上使用它吧。

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

Docker :
  • 在Windows上,安装Docker桌面(推荐)或在WSL2上使用Docker。否则,直接在Linux上安装Docker。
  • 您可以在Docker PostgreSQL 9.6 - installing extension plpython3u (clashing with quantile extension)找到一个典型的postgres Docker安装程序,您可以轻松地将其更改为更新的版本。
  • Docker的问题是,您需要额外的技巧,以便即使删除容器也能保存数据库,例如:
  • pg_dump/pb_restore/psql ... >/psql ... <以在本地Linux磁盘上进行备份,然后从您选择的装载卷恢复数据库,或者
  • 一个Web服务器来永久保存您的数据库。
  • 您也可以从像PostgreSQL on Docker: How to install and run python dependencies under plpython3u ?这样的线程中获得第一印象,或者将official postgres image using docker-compose指南作为postgres的基础并通过plpython3对其进行扩展。
  • 在一个无法使用plpython3u的容器中,一个主要的技巧是添加SymLinks而不是硬编码的安装路径,请参阅Add plpython3 Extension to Postgres/timescaledb Alpine Docker Image。这对我很有效。使用这个alpine TimescaleDB Dockerfile,我可以使用plpython3u!我无法安装上面kmeans测试所需的包,包括panda、scikit-learn和pickle,pip和Poetry都不支持,而且似乎Python 3.6的这个alpine容器不支持panda,而Python 3.7支持:Installing pandas in docker Alpine。如果所需的包无法安装,plpython3u在这个Docker容器中就没有任何价值。这就是为什么你应该使用PostgreSQL的一个更新的Docker映像(或者例如timescaleDB),这样你就不会遇到Python 3.6依赖的遗留问题。
独立

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

猜测答案(全错;请参见可接受的答案)

随着WSL、WSL2和Docker Desktop的出现,Linux已经成为Windows的朋友。Windows似乎鼓励了这一点。Linux上向PostgreSQL的转变可能是Windows最近对plpython3u支持不足的原因。同时,你应该在Linux上安装它(独立的或在Docker容器中)。
但是Windows安装可能有什么问题呢?

  • 正如已经说过的,Windows没有得到Linux得到的PostgreSQL关注。我猜在Windows上,我必须从源代码安装PostgreSQL,以及plpython扩展及其依赖项,才能让plpython3u正常运行。
  • 也许,普通的Windows安装程序也不支持plpython,仅仅是因为一个技术细节:上面问题中的查询显示:PL/Python3U untrusted procedural language。在常规生产系统上可能不允许使用此选项。例如,Web服务器服务TimescaleForge(timescaleDB,基于PostgreSQL)已经回答说,由于安全风险,他们不提供任何plpython扩展,即使客户要求,他们宁愿提供可信的扩展,用于明确的问题,而不是一个完整的语言,可以做任何事情,因此是一个安全风险,显然,当从源代码构建时,你可以使用不可信的扩展,就像TimescaleForge使用他们自己的扩展一样。
  • 可能需要设置一个PATH变量,如“Module not found” when importing a Python package within a plpython3u procedure处的答案所示。
  • 也许在Windows上,Python的默认版本必须在安装前进行更改,这只是a Linux installation using make, with Python settings in /etc/make.conf的一个非常模糊的猜测
  • 最后:

似乎有可能,plpython3u将运行在Windows上的PostgreSQL时,使用相同的安装技巧,因为已经在上面提到的链接,添加plpython3扩展到Postgres/timescaledb阿尔卑斯山Docker图像,其中plpython3u的作品这个Docker文件中使用:

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上的主要技巧,以及,虽然我不能让它与符号链接在一个快速测试,见PostgreSQL on Windows: get “plpython3u” extension to run with the help of SymLinks?这是正确的删除,因为解决方案是容易得多,见其他答案。

unguejic

unguejic3#

虽然我在另一篇文章中有这个答案,但我发现在这里给出完整的答案是有价值的,而不仅仅是链接,再加上一些编辑。
我也在尝试同样的方法。虽然我不是Maven,我的错误也有点不同,但这里有几件事需要检查:
步骤-1

  • share\extension\下,应该有plpython3u.controlplpython3u--1.0.sql才能执行CREATE EXTENSION plpython3u;
  • 确保你没有任何错别字在这上面的命令.

步骤-2

  • lib\下应该有一个plpython3.dll,这个可能是在上面的步骤之后创建的。
  • 请确认lib\在您的PATH中。

步骤-3

  • 如果没有PYTHONHOME,服务器将崩溃。
  • PYTHONHOME应该在系统/用户环境中设置,或者应该在服务器启动之前设置。版本似乎没有设置这个名称重要。plpython3.dll似乎要查找python39.dll,但我可以在3.8安装中使用它。
  • python版本差异应该引起一个错误只有当你尝试到使用特定的功能到那版本.安装另一个新的/旧的版本如果你需要那.只是不要忘记关于PYTHONHOME.

我使用的是压缩版的Postgres,所以下面是我运行服务器的方法。

set PATH=%PATH%;d:\pgsql\bin\;d:\pgsql\lib\
set PYTHONHOME=c:\DevTools\Python\Python38
pg_ctl -D d:\pgsql\pgdata -l logfile start

PS:我不允许python安装程序在环境中设置东西,因为我使用了很多版本,没有版本管理器。所以它通常会导致我有这类错误,但它们在这里和那里都是很好的脑力锻炼:)

相关问题