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

pyqt sqlite3 icu fts3 fts4 enabled 。全文搜索 功能,第1张

概述目标: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 mod

目标: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已经增加了对sqlite3的支持,但某时候如果你没有在PATH中指出icu的动态库(icudt50.dllicuin50.dllicuuc50.dll)路径,则sqlite3运行时依赖icu所以sqlite3不能正常启动,就报以上错误。 对于pyqt我们可以将这3个动态库直接置于c:\python27\DLLS\ 目录下。
总之,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 。全文搜索 功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1174549.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存