【发布时间】:2020-09-29 21:46:51
【问题描述】:
我使用 PostgreSQL 9.6.17(安装在 LAN 上的 Linux 服务器上)并拥有安装了 Python 3.7 或 3.8 和 PyQt 5.13.2 的 Win10(或 Win7)客户端,并且我使用该 PostgreSQL 服务器的 PyQt5 应用程序工作正常,但是我真的不知道我在做什么。
我将描述问题。如果我没有在 Win 客户端上安装 PostgreSQL(我不需要它,因为我在 Linux 服务器上使用 PostgreSQL)或者安装了它但不在路径中,我的应用程序崩溃并出现错误:
“QSqlDatabase:未加载 QPSQL 驱动程序”。
所以,我需要一些驱动程序。然后我在 Win 客户端上安装 PostgreSQL 9.6.x 并将其放在路径中,之后一切正常,但前提是我有运气并选择了正确的 PostgreSQL 版本。
另一种方法是我不在客户端计算机上安装 PostgreSQL 9.6.x(为什么我需要安装它),而只是在 app 目录中复制一些 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 及更高版本。
所以,我的问题是:
我怎么知道应该使用各种版本的 PyQt5 将哪些驱动程序(dll 文件)复制到我的应用程序目录,这对我来说是个谜。例如,我应该在 PyQt 版本 5.14 或 5.15 中使用什么驱动程序,因为上面的 3 个dlls 不再工作了?找到合适的驱动程序完全是随机猜测工作,我真的不知道我在做什么,我可以说我很幸运能找到 PyQt 5.13.2 的驱动程序。而且,我不知道将驱动程序复制到我的应用程序目录(或将它们放在路径中的某个文件夹中)是否正确?
这里有一个很好的答案:
QT5: Failed to load psql driver in windows
“很可能会失败,因为缺少 qsqlpsql.dll 的依赖项 - libpq.dll 或 libpq 构建所需的库之一。” ...“如果可能,您应该使用与 Qt 的 qsqlpgsql.dll 编译时所针对的相同的 libpq。”
如果这是真的,我怎么知道 qsqlpgsql.dll 是用什么 libpq 库编译的?我想 PyQt 5.13.2 的 qsqlpgsql.dll 编译的版本与 PyQt 5.14.x 的 qsqlpgsql.dll 甚至 5.15.x 的 qsqlpgsql.dll 不同。
另外,这个链接有一些线索: QPSQL driver not loaded Qt
一般来说,在 PyQt5 中使用 PostgreSQL 的最佳方式是什么。如果(正确版本的)PostgreSQL 未安装在客户端计算机上或适当的驱动程序不在路径中,它显然不能开箱即用。
更新:
我将通过假设的例子来提出这个问题。
假设我有一个 Qt (PyQt) 应用程序,用户客户端 Win10 计算机上的 Qt xyz 版本(例如 5.15.0)和安装在 Linux 服务器上的 Postgres abc(例如 9.6.17),通过 LAN 从客户端计算机访问(或VPN,或其他)。我不应该在客户端 Win10 计算机上安装 Postgres。我必须在用户的应用程序目录或路径中拥有哪些文件(Postgres dll 或 lib 驱动程序)取决于 Qt x.y.z 和 Postgres a.b.c,以便我的应用程序正常工作,以及如何找到这些文件。所以,我需要一个公式:(*.dll, *.dll,,,) = f(x.y.z, a.b.c)。
更新(2020-09-25):
我的问题自己解决了。结合 Py 3.8.3、PyQt 5.15.1 现在可以正常工作了。我在几台Win客户端电脑上测试过。
【问题讨论】:
标签: postgresql qt pyqt pyqt5 qt5