微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

目标:windows下让pyqt测试程序支持sqlite3 icu fts3/4的全文搜索功能

  1. 环境:

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 安装包

  1. 难点:

一般自己的测试程序提示“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环境下,切换到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时会提示错误

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\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 错误

经过以上对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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,