目标:windows下让pyqt测试程序支持sqlite3 icu fts3/4的全文搜索功能。 html
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 安装包 数据库
通常本身的测试程序提示“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
QSqlDatabase: QSQLITE driver not loaded. QSqlDatabase: available drivers: QSQLITE QMYSQL3 QMYSQL QODBC3 QODBC QPSQL7 QPSQL
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。
接下来安装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应用程序中能够编写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功能。
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