目标:windows下让pyqt测试程序支持sqlite3 icu fts3/4的全文搜索功能。
环境:windows XP
pyqt 安装文件 PyQt-Py2.7-x86-gpl-4.9.6-1.exe
pyqt 源码包PyQt-win-gpl-4.9.4.zip
python 版本2.7
qt是官方下载的 4.8.4 EXE 安装包
难点:一般自己的测试程序提示“no such module: fts4”错误,可以按照 网上《Qt sqlite / sqlCipher driver plugin with ICU》 一文的如下说明就能得到支持icu fts3/4的qt sqlite3 plugins:
In order to make ICU work with the default sqlite driver plugin,you have to modify the .pro file,add the following linesdefineS += sqlITE_ENABLE_ICUINCLUDEPATH += "Path/To/icu/include"liBS += -L"Path/To/icu/lib" -licuuc -licuinand 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.8.4>configure -release -fast -qt-sql-sqlite
D:\Qt.8.4> cd src\sql
D:\Qt.8.4\src\sql>nmake
D:\Qt\4.8.4\src\sql>nmake install
到此 Qt本身的配置、重新编辑都完成。注意这里不用 D:\Qt.8.4>configure -release -fast -plugin-sql-sqlite
的方式。因为经过测试发现-plugin-sql-sqlite得到的qsqlite4.dll和Qtsql4.dll,软件配合pyqt运行python main.py时会提示错误
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时用
D:\Qt.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。不需要通过官方提供的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 错误)
经过以上对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.exeListDLLs v3.1 - List loaded DLLscopyright (C) 1997-2011 Mark RussinovichSysinternals - www.sysinternals.com------------------------------------------------------------------------------sqlite3.exe pID: 2916Command line: "D:\tmp\tmp\sqlite3.exe"Base Size Path0x00400000 0x150000 sqlite3.exe VerifIEd: InvalID Signature Publisher: sqlite Development Team Description: sqlite is a software library that implements a self-contained,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.exeListDLLs v3.1 - List loaded DLLscopyright (C) 1997-2011 Mark RussinovichSysinternals - www.sysinternals.com---------------------------------------------sqlite3.exe pID: 2916Command line: "D:\tmp\tmp\sqlite3.exe"Base Size Path0x00400000 0x150000 sqlite3.exe0x7c920000 0x93000 ntdll.dll0x7c800000 0x11e000 kernel32.dll0x4a800000 0x109000 icuuc50.dll0x77da0000 0xa9000 ADVAPI32.dll0x77e50000 0x93000 RPCRT4.dll0x77fc0000 0x11000 Secur32.dll0x4ad00000 0x13d4000 icudt50.dll0x78aa0000 0xbf000 MSVCR100.dll0x00550000 0x14d000 icuin50.dll0x78050000 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.sqlwiz_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
以上是内存溢出为你收集整理的pyqt sqlite3 icu fts3 fts4 enabled 。全文搜索 功能全部内容,希望文章能够帮你解决pyqt sqlite3 icu fts3 fts4 enabled 。全文搜索 功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)