pyqt sqlite3 icu fts3 fts4 enabled 。全文搜索 功能

目標:windows下讓pyqt測試程序支持sqlite3 icu fts3/4的全文搜索功能。 html

  1. 環境:

windows XP python

pyqt 安裝文件 PyQt-Py2.7-x86-gpl-4.9.6-1.exe linux

pyqt 源碼包 PyQt-win-gpl-4.9.4.zip sql

python 版本2.7 shell

qt是官方下載的 4.8.4 EXE 安裝包 數據庫

  1. 難點:

通常本身的測試程序提示「no such module: fts4」錯誤,能夠按照 網上《Qt SQLite / SQLCipher driver plugin with ICU 》 一文的以下說明就能獲得支持icu fts3/4的qt sqlite3 plugins: ubuntu

In order to make ICU work with the default SQLite driver plugin, you have to modify the .pro file, add the following lines

DEFINES += SQLITE_ENABLE_ICU
INCLUDEPATH += "Path/To/icu/include"
LIBS += -L"Path/To/icu/lib" -licuuc -licuin

and rebuild your SQLite driver plugin.
據此,我在$QT/4.8.4/src/3rdparty/sqlite.pri文件增長若干定義(如下爲.diff 文件):
--- C:/Documents and Settings/Administrator/桌面/sqlite.pri	星期六 二月  9 20:48:49 2013
+++ D:/qt/4.8.4/src/3rdparty/sqlite.pri	星期六 二月  9 18:01:59 2013
@@ -1,6 +1,8 @@
 CONFIG(release, debug|release):DEFINES *= NDEBUG
-DEFINES += SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_COMPLETE
+DEFINES += SQLITE_ENABLE_ICU SQLITE_ENABLE_FTS3 SQLITE_ENABLE_FTS4 SQLITE_ENABLE_FTS3_PARENTHESIS SQLITE_ENABLE_RTREE
+INCLUDEPATH += "d:\tmp\qt\zyj\zyj\icu\icu\include"
+LIBS += -L"d:\tmp\qt\zyj\zyj\icu\icu\lib" -licuuc -licuin
 blackberry: DEFINES += SQLITE_ENABLE_FTS3 SQLITE_ENABLE_FTS3_PARENTHESIS SQLITE_ENABLE_RTREE
 wince*: DEFINES += HAVE_LOCALTIME_S=0
 INCLUDEPATH +=  $$PWD/sqlite
-SOURCES +=      $$PWD/sqlite/sqlite3.c
\ No newline at end of file
+SOURCES +=      $$PWD/sqlite/sqlite3.c
修改完成後,在qt 4.8.4 command prompt環境下,切換到 Qt\4.8.4\ 目錄。執行
D:\Qt\4.8.4>configure -release -fast -qt-sql-sqlite
D:\Qt\4.8.4> cd src\sql
D:\Qt\4.8.4\src\sql>nmake
D:\Qt\4.8.4\src\sql>nmake install 
到此 Qt自己的配置、從新編輯都完成。注意這裏不用
D:\Qt\4.8.4>configure -release -fast -plugin-sql-sqlite

的方式。由於通過測試發現-plugin-sql-sqlite獲得的qsqlite4.dll和QtSql4.dll,軟件配合pyqt運行python main.py時會提示錯誤 windows

QSqlDatabase: QSQLITE driver not loaded. QSqlDatabase: available drivers: QMYSQL3 QMYSQL QODBC3 QODBC QPSQL7 QPSQL


這可能是因爲pyqt的plugins\sqldrivers\目錄及qsqlite3.dll 放置錯誤。或者出現如下錯誤

QSqlDatabase: QSQLITE driver not loaded. QSqlDatabase: available drivers: QSQLITE QMYSQL3 QMYSQL QODBC3 QODBC QPSQL7 QPSQL


這樣的錯誤,這是由於雖然configure已經增長了對Sqlite3的支持,但某時候若是你沒有在PATH中指出icu的動態庫(icudt50.dll icuin50.dll icuuc50.dll)路徑,則sqlite3運行時依賴icu因此sqlite3不能正常啓動,就報以上錯誤。 對於pyqt咱們能夠將這3個動態庫直接置於c:\python27\DLLS\ 目錄下。

總之,configure時用
D:\Qt\4.8.4>configure -release -fast -plugin-sql-sqlite
更容易出
問題,在pyqt的情景下解決很麻煩,可是不值得去浪費時間折騰。因此採用-qt-sql-sqlite這種configure參數,就沒有那麼麻煩了通過以上對Qt4.8.4的src\sql\ 下的qt與sqlite3的從新生成,咱們獲得了支持fts4的qtsql4.dll。
  1. 對pyqt的修改

接下來安裝pyqt。不須要經過官方提供的pyqt的exe 文件安裝,由於這些預編譯好的運行時庫並不支持FTS4功能,因此從官方下載pyqt4源碼文件(好比「 http://superb-dca2.dl.sourceforge.net/project/pyqt/PyQt4/PyQt-4.9.4/PyQt-win-gpl-4.9.4.zip 」,注意pyqt 4.8.4源碼網上找不到了)。按照《PyQt在Windows XP上的編譯》 http://my.oschina.net/kjpioo/blog/133397 的方法進行編譯安裝。以上源碼安裝默認將目的文件安裝到 c:\Python27\Lib\site-packages\PyQt4\。該目錄下有 QtGuid4.dll QtSql4.dll等衆多運行時庫。因爲pyqt源碼安裝時從Qt 4.8.4 目錄中動態讀取配置並據今生成sip代碼文件,最終生成衆多.pyd文件,這些都是根據qt 4.8.4的configure配置生成的,也就是咱們獲得的QtSql.pyd文件就是支持sqlite3 fts4功能的!(若是不從pyqt4 源碼安裝,而用官方提供的pyqt4的exe 文件安裝,這時pyqt4\安裝目錄下的默認文件QtSql.pyd 被用來操做sqlite3的fts4表時會提示no such module: fts4 錯誤) less

通過以上對pyQt 4.9.4的從新生成,咱們獲得了支持fts4的qtsql.pyd 動態庫。須知 qtsql4.dll和 qtsql.pyd 就是本文的兩個最關鍵!

最後,在咱們的pyqt應用程序中能夠編寫sqlite3 icu ft3/4操做的pyqt代碼,進行測試。 測試

  • 總結驗證:

sqlite3分詞功能運行時對icu的dll依賴的驗證:能夠看出

icuuc50.dll  icudt50.dll icuin50.dll 這三個文件是ICU 運行時必須的 
D:\tmp\tmp\ListDlls>Listdlls.exe -v  sqlite3.exe

ListDLLs v3.1 - List loaded DLLs
Copyright (C) 1997-2011 Mark Russinovich
Sysinternals - www.sysinternals.com

------------------------------------------------------------------------------
sqlite3.exe pid: 2916
Command line: "D:\tmp\tmp\sqlite3.exe"

Base        Size      Path
0x00400000  0x150000  sqlite3.exe
        Verified:       Invalid Signature
        Publisher:      SQLite Development Team
        Description:    SQLite is a software library that implements a self-cont
ained, serverless, zero-configuration, transactional SQL database engine.
        Product:        SQLite
        Version:        3.7.15.1
        File version:   3.7.15.1
D:\tmp\tmp\ListDlls>Listdlls.exe sqlite3.exe

ListDLLs v3.1 - List loaded DLLs
Copyright (C) 1997-2011 Mark Russinovich
Sysinternals - www.sysinternals.com

---------------------------------------------
sqlite3.exe pid: 2916
Command line: "D:\tmp\tmp\sqlite3.exe"

Base        Size      Path
0x00400000  0x150000  sqlite3.exe
0x7c920000  0x93000   ntdll.dll
0x7c800000  0x11e000  kernel32.dll
0x4a800000  0x109000  icuuc50.dll
0x77da0000  0xa9000   ADVAPI32.dll
0x77e50000  0x93000   RPCRT4.dll
0x77fc0000  0x11000   Secur32.dll
0x4ad00000  0x13d4000  icudt50.dll
0x78aa0000  0xbf000   MSVCR100.dll
0x00550000  0x14d000  icuin50.dll
0x78050000  0x69000   MSVCP100.dll

如下是c:\python27\lib\site-packages\pyqt4\examples\sql\ 目錄下的tablemodel.pyw 運行時的依賴關係:能夠看到因爲須要QtSql模塊,這時pyqt 默認加載的QtSql動態庫是QtSql4.dll QtSql.pyd 和c:\python27\lib\site-packages\pyqt4\plugins\sqldrivers\qsqlite4.dll。而咱們編譯qsqlite4.dll時已經指定要ICU支持,因此qsqlite4.dll又依賴於ICU,因此下圖中

icuuc50.dll icudt50.dll icuin50.dll 這三個文件

也被加載。因爲tablemodel.pyw 程序使用基於內存的sqlite數據庫,且不須要fts4支持,因此運行時基於pyqt4默認安裝的sqlite4.dll不會報錯。

那麼若是這時候咱們本身的(須要fts4支持)軟件打開時提示

last sql error:
no such module: fts4 
Unable to execute statement

咱們就能夠認爲是  c:\python27\lib\site-packages\ pyqt4\plugins\sqldrivers\qsqlite4.dll 出了問題。解決方法參考上文 「對pyqt的修改」 部分。

注意:ubuntu12.04下通過測試,ubuntu默認安裝的sqlite3已經支持FTS功能。

  1. 參考文檔:

http://qt.onyou.ch/2011/05/29/enabling-fts-module-in-sqlite-for-qt/

http://blog.sobex-software.de/?p=229

http://blog.chinaunix.net/uid-13750160-id-3488550.html

PyQt在Windows XP上的編譯 http://blog.csdn.net/stoneyang0915/article/details/8078487

Build FTS index end succeed: 爲知筆記使用手冊 「爲知筆記」linux&Mac版,其全文搜素功能就是基於sqlite的FTS。在tag設計方面能夠參考wiz的sql文件:

$ ls /usr/share/wiznote/sql/
wiz_deleted_guid.sql         wiz_document_param.sql  wiz_document_tag.sql  wiz_object_ex.sql  wiz_tag_group.sql
wiz_document_attachment.sql  wiz_document.sql        wiz_meta.sql          wiz_style.sql      wiz_tag.sql

本人文章除註明轉載外,均爲本人原創或編譯
歡迎任何形式的轉載,但請務必註明出處,尊重他人勞動共創開源社區
轉載請註明:文章轉載自:開源中國社區 [http://www.oschina.net]
本文標題:pyqt sqlite3 icu  fts3 fts4 enabled 。全文搜索 功能
本文地址:http://my.oschina.net/kjpioo/blog/108458

相關文章
相關標籤/搜索