赞
踩
目标: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 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环境下,切换到 Qt4.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时会提示错误
QSqlDatabase: QSQLITE driver not loaded. QSqlDatabase: available drivers: QMYSQL3 QMYSQL QODBC3 QODBC QPSQL7 QPSQL
这多是由于pyqt的pluginssqldrivers目录及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:python27DLLS 目录下。
总之,configure时用
D:\Qt\4.8.4>configure -release -fast -plugin-sql-sqlite
更容易出问题,在pyqt的情景下解决很麻烦,但是不值得去浪费时间折腾。所以采用-qt-sql-sqlite这种configure参数,就没有那么麻烦了。经过以上对Qt4.8.4的srcsql 下的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:Python27Libsite-packagesPyQt4。该目录下有 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.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:python27libsite-packagespyqt4examplessql 目录下的tablemodel.pyw 运行时的依赖关系:可以看到由于需要QtSql模块,这时pyqt 默认加载的QtSql动态库是QtSql4.dll QtSql.pyd 和c:python27libsite-packagespyqt4pluginssqldriversqsqlite4.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:python27libsite-packages pyqt4pluginssqldriversqsqlite4.dll 出了问题。解决方法参考上文 “对pyqt的修改” 部分。
注意:ubuntu12.04下经过测试,ubuntu默认安装的sqlite3已经支持FTS功能。
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。