我们知道Qt可以支持的数据库有很多,如下所示:
Driver | DB |
---|---|
QDB2 | IBM DB2 |
QIBASE | Borland InterBase Driver |
QMYSQL | MySQL Driver |
QOCI | Oracle Call Interface Driver |
QODBC | ODBC Driver (includes Microsoft SQL Server) |
QPSQL | PostgreSQL Driver |
QSQLITE | SQLite version 3 or above |
QSQLITE2 | SQLite version 2 |
QTDS | Sybase Adaptive Server |
但是在windows平台下,直接可以使用的数据库驱动只有QSQLITE和QSQLITE2,像QMYSQL、QPSQL等数据库如果直接使用就会出现数据驱动未加载的情况。
最近因为数据库驱动的问题搞得自己一个头两个大,查了很多的参考资料,也都尝试了遍(那种死马当活马医的心态),反反复复搞了好久,最后终于成功了(激动的我要哭了)
- 软件及系统环境:win10,Qt5.13.1(mingw32),PostgreSql10.6(32位)
- 报错如下:
QSqlDatabase: QPSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QMYSQL QMYSQL3 QODBC
第一句话指的是QPSQL数据库驱动未加载
第二句话指的是Qt中可用的数据库
从这两句话中我们知道Qt中QPSQL驱动是可以使用的,问题是我们没有加载。
没有加载的原因很多,最常见的是未找到该驱动(和Qt的动态库、静态库的链接有关)所以我们可以按照下面的方法进行排除查找原因。
- 首先查看自己安装的Qt的版本和PostgreSql的版本,若Qt是32位的,那么PostgreSql也要选择安装32位的。如果安装的位数不一样驱动肯定找不到的。
- 然后查看自己是否添加Qt和PostgreSql的环境变量,若没有,添加如下环境变量
- 复制以下dll和lib到可执行文件目录
libintl.lib
libpq.dll
libpq.lib
qsqlpsqld.dll
qsqlpsql.dll
ssleay32.dll
libeay32.dll - 复制libpq.dll到C:Windwos/目录下。
- 在你的工程运行目录下执行“windeployqt AppName.exe”
QPSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QP
我就是做了上述这些步骤后然后PSQL驱动就可以加载了,自然而然就连接上了PostgreSQL数据库。这是把我激动坏了!!!
其他的尝试
* 其实我查询资料很多人都说可以重新编译PostgreSQL数据库的驱动,会生成我们需要的dll包,将这些拷贝到Qt项目可执行文件目录下。 这里我也尝试过这个方法,使用mingw32编译器重新编译psql的驱动,需要注意的一点是qt需要使用源码安装,不然你无法找到src这个目录。 编译的命令如下:
qmake "INCLUDEPATH+=D:\PostgreSQL\10\include" "LIBS+=D:\PostgreSQL\10\lib\libpql.lib" -o Makefile
pqsql.pro
mingw32-make
上面的路径是你安装PostgreSQL数据库的路径,这里建议大家安装PostgreSQL数据库的时候不要安装在有空格的目录下,比如program files(这就是包含空格的)。
* 另外,我还尝试使用使用mingw32编译libpqxx包,这是C++的一个连接PostgreSql的包,悲伤的是我没有成功,总是有一个C++11的错误,我当时也懒得搞了就去寻找要其他的办法了。 然而编译libpqxx包的方法是切实可行的,因为我在我原来的脑上连接postgresql数据库就是使用的这个方法,可是几个月我就忘记我当时怎么做的了(痛恨自己当时为什么没有记录下方法)。
libpqxx是C++的一个接口,自然的有一个C语言的接口 libpq。大家都可以尝试,
上面我使用的是windows系统和qt中的mingw编译器。如果使用mac系统就不存在驱动编译的问题了。如果使用的msv(Visual Studio)编译器,方法和这个应该是类似的!
上述如果大家有任何想法和意见建议,欢迎大家指出,我们共同进步!!
写在最后
如果有小伙伴编译成功了,要告诉我鸭,我很想很想尝试.
我的QQ:2637394747