我已经添加了我能找到的所有细节,以及所有的链接,似乎没有办法让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。
学分授予:
- 无法加载库plpython3.dll--〉注解:在哪里可以找到这些信息?比如plpython3u需要哪个python版本?,回答Jul 17 '20
- Error during: CREATE EXTENSION plpython3u; on PostgreSQL 9.6.0,2020年10月2日编辑
相关:
步骤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\
学分授予:
- could not load library plpython3.dll,于2018年1月31日回复
步骤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;
学分授予:
- Error during: CREATE EXTENSION plpython3u; on PostgreSQL 9.6.0,已于2017年9月18日回复
- Is there any recipe to successfully install PLPython in Postgresql 9.3 64bit or 32bit on Windows 64 bits?,已于2014年2月8日回复
- Cannot install plpython for postgres 12,已于2020年10月2日回复
相关问题:
- PostgreSQL unable to create plpythonu extension
- 如何在PostgreSQL 9.3 x64 Windows 7上安装PL/Python?
- i'm facing issues to create a postgresql plpython3u extension
步骤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
。
学分授予:
- Using psql how do I list extensions installed in a database?
- PostgreSQL: how to install plpythonu extension
- Run python script from PostgreSQL function
- Can't “install” plpython3u - postgresql,于2020年6月9日发表评论
步骤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似乎曾经工作过,我看不出有什么理由我应该投资到这一点。
学分授予:
- 当我尝试使用plpython3u [WIN10,pgAdmin4 3.5]创建函数时,PosgreSQL 11失去连接,2018年11月25日回复
- Can't “install” plpython3u - postgresql --> comments,于2020年6月9日发表评论
相关:
使用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.
- (这是psql: server closed the connection unexepectedly中的一个问题,但并不关注这个Python扩展问题)*
以及
The application has lost the database connection.
- (这是一个问题,在PosgreSQL 11失去了连接,当我试图创建函数与plpython3u [WIN10,pgAdmin4 3.5],但将意味着安装v3.7.10从源只有最新的子版本,我试图找出正确的子版本或其他技巧,让它运行之前这样做)*
3条答案
按热度按时间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
ycl3bljg2#
解决方法:plpython3u确实可以在Linux上工作!所以在Linux上使用它吧。
最后一段不是问题的一部分,只是列出了在Linux上的一些步骤,作为Windows plpython3u安装不起作用时的替代方法。
Docker :
pg_dump
/pb_restore
/psql
...>
/psql
...<
以在本地Linux磁盘上进行备份,然后从您选择的装载卷恢复数据库,或者plpython3u
?这样的线程中获得第一印象,或者将official postgres image using docker-compose指南作为postgres的基础并通过plpython3对其进行扩展。独立
当永久地本地保存数据变得更加重要时,您也可以尝试在独立的Linux上安装。
postgresql-plpython3-13
用于postgres 13;在9/2021,这将安装Python3.8.10
。**我可以确认它工作!**我可以创建上面的plpython3ureturn_version()
函数并运行它。如果你需要导入需要安装的包,请参见例如Linux: How to install a Python package so that it is found by the already working PostgreSQL 13 plpython3u extension?。猜测答案(全错;请参见可接受的答案)
随着WSL、WSL2和Docker Desktop的出现,Linux已经成为Windows的朋友。Windows似乎鼓励了这一点。Linux上向PostgreSQL的转变可能是Windows最近对plpython3u支持不足的原因。同时,你应该在Linux上安装它(独立的或在Docker容器中)。
但是Windows安装可能有什么问题呢?
PL/Python3U untrusted procedural language
。在常规生产系统上可能不允许使用此选项。例如,Web服务器服务TimescaleForge(timescaleDB,基于PostgreSQL)已经回答说,由于安全风险,他们不提供任何plpython扩展,即使客户要求,他们宁愿提供可信的扩展,用于明确的问题,而不是一个完整的语言,可以做任何事情,因此是一个安全风险,显然,当从源代码构建时,你可以使用不可信的扩展,就像TimescaleForge使用他们自己的扩展一样。似乎有可能,plpython3u将运行在Windows上的PostgreSQL时,使用相同的安装技巧,因为已经在上面提到的链接,添加plpython3扩展到Postgres/timescaledb阿尔卑斯山Docker图像,其中plpython3u的作品这个Docker文件中使用:
因此,必须安装
.plpython3-deps
和postgresql-plpython3
,并且必须添加SymLink。也许,这样的符号链接已经是Windows上的主要技巧,以及,虽然我不能让它与符号链接在一个快速测试,见PostgreSQL on Windows: get “plpython3u” extension to run with the help of SymLinks?这是正确的删除,因为解决方案是容易得多,见其他答案。
unguejic3#
虽然我在另一篇文章中有这个答案,但我发现在这里给出完整的答案是有价值的,而不仅仅是链接,再加上一些编辑。
我也在尝试同样的方法。虽然我不是Maven,我的错误也有点不同,但这里有几件事需要检查:
步骤-1
share\extension\
下,应该有plpython3u.control
和plpython3u--1.0.sql
才能执行CREATE EXTENSION plpython3u;
步骤-2
lib\
下应该有一个plpython3.dll
,这个可能是在上面的步骤之后创建的。lib\
在您的PATH
中。步骤-3
PYTHONHOME
,服务器将崩溃。PYTHONHOME
应该在系统/用户环境中设置,或者应该在服务器启动之前设置。版本似乎没有设置这个名称重要。plpython3.dll
似乎要查找python39.dll
,但我可以在3.8安装中使用它。PYTHONHOME
.我使用的是压缩版的Postgres,所以下面是我运行服务器的方法。
PS:我不允许python安装程序在环境中设置东西,因为我使用了很多版本,没有版本管理器。所以它通常会导致我有这类错误,但它们在这里和那里都是很好的脑力锻炼:)