我們知道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