Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PyQt5中使用PostgreSQL的正确方法是什么_Postgresql_Qt_Pyqt_Pyqt5_Qt5 - Fatal编程技术网

在PyQt5中使用PostgreSQL的正确方法是什么

在PyQt5中使用PostgreSQL的正确方法是什么,postgresql,qt,pyqt,pyqt5,qt5,Postgresql,Qt,Pyqt,Pyqt5,Qt5,我使用PostgreSQL 9.6.17(安装在局域网上的Linux服务器上),有安装了Python 3.7或3.8和PyQt 5.13.2的Win10(或Win7)客户端,我的PyQt5应用程序使用该PostgreSQL服务器工作正常,但我真的不知道我在做什么 我来描述一下这个问题。如果我没有在Win client上安装PostgreSQL(我不需要它,因为我在Linux server上使用PostgreSQL),或者我安装了它,但不在路径中,我的应用程序会崩溃,并出现以下错误: “QSqlD

我使用PostgreSQL 9.6.17(安装在局域网上的Linux服务器上),有安装了Python 3.7或3.8和PyQt 5.13.2的Win10(或Win7)客户端,我的PyQt5应用程序使用该PostgreSQL服务器工作正常,但我真的不知道我在做什么

我来描述一下这个问题。如果我没有在Win client上安装PostgreSQL(我不需要它,因为我在Linux server上使用PostgreSQL),或者我安装了它,但不在路径中,我的应用程序会崩溃,并出现以下错误:

“QSqlDatabase:QPSQL驱动程序未加载”

所以,我需要一些司机。我在Win客户端上安装了PostgreSQL 9.6.x,并将其放在path中,之后一切正常,但前提是我运气好,选择了正确的PostgreSQL版本

另一种选择是,我不在客户机上安装PostgreSQL 9.6.x(为什么我需要安装它),而只是复制应用程序目录中的一些
dll
文件。如果我找到了正确的文件(驱动程序),一切正常,但如果我没有找到,应用程序会崩溃,并出现以下错误:

“QSqlDatabase:未加载QPSQL驱动程序”

或者更糟糕的是,识别服务器上的PostgreSQL数据库,有时可以正常工作,但在第一次、第二次或第三次查询之后,它会崩溃

我复制到与PyQt 5.13.2一起使用的应用程序目录的驱动程序组合:

Timestamp                      Size File
25/02/2016  07:19         1,015,973 libiconv-2.dll
07/01/2016  09:02         1,550,023 libintl-8.dll
10/07/2019  20:20           145,408 libpq.dll
如果我安装PyQt 5.14或5.15(而不是PyQt 5.13.2),应用程序会崩溃,我担心会将PyQt5升级到5.14或更高版本

所以,我的问题是: 我如何知道哪些驱动程序(
dll
文件)应该使用不同版本的PyQt5复制到我的应用程序目录,这对我来说是个谜。例如,我应该在PyQt版本5.14或5.15中使用什么驱动程序,因为上面的3个
dll
s不再工作了?找到正确的驱动程序完全是随机猜测的工作,我真的不知道我在做什么,我可以说我在PyQt 5.13.2的驱动程序方面很幸运。而且,我也不知道将驱动程序复制到我的应用程序目录(或者将它们放在路径中的某个文件夹中)是否是正确的方法

这里有一个很好的答案:

“它很可能会失败,因为缺少qsqlpsql.dll的依赖项-libpq.dll或libpq生成所需的库之一。”。。。“如果可能,您应该使用编译Qt的qsqlpgsql.dll时使用的同一个libpq。”

如果这是真的,我怎么知道libpq库
qsqlpgsql.dll
是用什么编译的呢?我假设Pyqt5.13.2的
qsqlpgsql.dll
是用不同于Pyqt5.14.x的
qsqlpgsql.dll
甚至是5.15.x的
qsqlpgsql.dll
的版本编译的

此外,此链接还有一些线索:

一般来说,在PyQt5中使用PostgreSQL的最佳方式是什么。如果(正确版本的)PostgreSQL未安装在客户端计算机上,或者相应的驱动程序不在path中,则显然无法开箱即用

更新
我将通过一个假设的例子来回答这个问题。 假设我在用户客户端Win10计算机上安装了一个Qt(PyQt)版本的应用程序,Qt x.y.z(例如5.15.0)版本的应用程序,在Linux服务器上安装了Postgres a.b.c(例如9.6.17),该应用程序可以通过LAN(或VPN,或其他方式)从客户端计算机访问。我不应该在客户端Win10计算机上安装Postgres。根据Qt x.y.z和Postgres a.b.c,我必须在用户的应用程序目录或路径中包含哪些文件(Postgres dll或lib驱动程序),才能使我的应用程序正常工作,以及如何找到这些文件。所以,我需要一个公式:(*.dll,*.dll,,,)=f(x.y.z,a.b.c)

更新(2020-09-25)
我的问题自己解决了。使用Py 3.8.3和PyQt 5.15.1的组合,它现在可以正常工作。我在几个Win客户端计算机上测试了它。

所以在更新部分 您有两个系统:

系统1)带有Linux操作系统的服务器,例如

  • 可能(Qt版本5.15.0)
  • PostgreSql 9.6.17
  • 可能(Python 3.1.1)
系统2)带有Win操作系统的客户端

  • Qt版本5.1.0
  • PostgreSql 9.6.17
  • Python 3.1.1
我建议您的客户端系统至少应具有 您可以使用服务器库(此处为9.6.17)版本。或者单独检查每个库的库兼容性

建议A: 为什么不使用您选择的libversion构建 用于系统2,也可能用于系统1(如果需要) 您将拥有两个系统的*.dll和*.so文件。 请阅读文章“如何使用特定驱动程序支持配置qt”:

建议B 打包包含dll文件的python应用程序

发布应用程序的一般win os工作流程

A) 使用生成中的所有dll文件(用于qt和PostgreSQL) 环境,并将它们复制到与可执行文件相同的文件夹中。 也许你在使用这个程序
要弄清楚,哪些是链接的。(大多数情况下可在qt安装目录中找到)

B) 将应用程序与所有dll文件一起发送,并确保目标操作系统
具有相同的体系结构(i86 | amd64 |等),并且使用相同的PostgreSQL server版本。

我意识到您的目标只是与您的PostgreSQL server建立连接并与数据库交互

因此,您可以编写裸python服务来与PostgreSQL服务器交互。我认为,通过使用,你可以很容易地实现你想要的


如果您以这种方式实现,您的客户机上就不需要PostgreSQL驱动程序。

谢谢您的回答。问题是,选择Python和PyQt,我认为我将避免使用C++,这就是选择PyQT的全部要点。我甚至没有安装Qt,只有PyQt,所以我在Qt构建环境中没有dll(libpq.dll,…),因为我没有它。我只是需要一种方法来为PyQt5.14和PyQt5.15的Postgres获取合适的dll文件,因为使用PyQt5.13的dll文件在使用更高版本的PyQt.mm时不再有效