【问题标题】:What is the right way to use PostgreSQL with PyQt5将 PostgreSQL 与 PyQt5 一起使用的正确方法是什么
【发布时间】: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


    【解决方案1】:

    所以在你的更新部分 您有 2 个系统:

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

    • 也许(Qt 版本 5.15.0)
    • PostgreSql 9.6.17
    • 也许(Python 3.1.1)

    系统 2) 带有 Win OS 的客户端

    • Qt 版本 5.1.0
    • PostgreSql 9.6.17
    • Python 3.1.1

    我建议您的客户端系统至少应该有 您的服务器库(此处为 9.6.17)版本。或者单独检查每个库的库兼容性。

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

    建议 B 打包您的 python 应用程序via python installer pyinstaller,包括您的 dll 文件。

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

    A) 使用构建中的所有 dll 文件(用于 qt 和 PostgreSQL) 环境并将它们复制到与可执行文件相同的文件夹中。 或许你用的程序Dependency Walker
    找出其中哪些是相关联的。 (大部分时间在qt安装目录下)

    B) 使用所有 dll 文件运送您的应用程序,并确保目标操作系统 具有相同的架构(i86| amd64| 等),并且使用相同的 PostgreSQL 服务器版本。

    【讨论】:

    • 感谢您的回答。问题是,选择 python 和 PyQt 我认为我会避免使用 C++,这就是选择 PyQt 的全部意义所在。我什至没有安装 Qt,只有 PyQt,所以我在 Qt 构建环境中没有 dll(libpq.dll,...),因为我没有它。我只需要一种方法来为 PyQt5.14 和 PyQt5.15 的 Postgres 获取适当的 dll 文件,因为适用于 PyQt5.13 的 dll 文件不再适用于更高版本的 PyQt。
    • mmh 我明白了,但总的来说 p​​yQt 只是绑定 Cpp Qt-Framework 代码,所以在远端会有一个 dll 或一些静态库,通过 python 中的绑定代码调用,还是我误解了什么?
    • 你是对的,可能“某处”有图书馆,但我找不到它们。我需要用于 PyQt 5.15 的 Postgres 9.6 库。而且我还想知道未来的程序是什么,如何为 Postgres 版本和 PyQt/Qt 版本的某些组合找到合适的库。
    • 也许我确实认为以“cpp 方式”发布您的应用程序,也许您应该使用 pip 通过riverbankcomputing.com/software/pyqt/download5 安装deps?
    • 问题是 PSQL 的驱动程序不是 PyQt 的组成部分,因此在安装 PyQt 并通过 pip 连接到 Postgres 后无法开箱即用(例如,与 Sqlite 不同)。
    【解决方案2】:

    我意识到您的目标只是与您的 PostgreSQL 服务器建立连接并与您的数据库进行交互。

    因此,您可以编写裸 python 服务来与 PostgreSQL 服务器交互。使用psycopg2-binary,我想,你可以轻松实现你想要的。

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

    【讨论】:

    • 我明白这一点(并且经常使用 psycopg2),但那样我应该放弃 Qt MVC 的所有祝福(QSqlQueryModel、QSqlQuery 等 QtSql 类)并开始编写我的应用程序( SQL部分)从头开始,这是不可接受的。
    • 这只是什么 dll 使用具有 Qt 5.15.x 或 PyQt 5.15.x 应用程序并与远程 Postgres 9.6.x 服务器一起使用的人的问题(只是几个正确的 dll 文件的问题)。对我来说,一个人应该如何知道 dll 文件与例如哪些文件一起使用,这完全是个谜。 Qt 5.15 和 Postgres 9.6,哪些 dll 文件与 Qt 5.13 和 Postgres 10 一起使用,哪些 dll 文件与 Qt 5.12 和 Postgres 11 一起使用,...
    猜你喜欢
    • 2018-04-10
    • 2013-01-02
    • 1970-01-01
    • 2020-08-27
    • 2020-07-10
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多