首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在sqlalchemy中使用SQLite fts匹配查询

如何在sqlalchemy中使用SQLite fts匹配查询
EN

Stack Overflow用户
提问于 2014-01-21 12:43:51
回答 1查看 2K关注 0票数 2

我有一个带有“图书”表的SQLite数据库

sqlalchemy是设置好的,所以我可以像这样查询数据库:

代码语言:javascript
运行
复制
Session.query(Book).filter(Book.title.like(u'%linux%')).all()

由于该表是一个支持fts4 (3)的虚拟表,所以我们可以搜索整词,如下所示

代码语言:javascript
运行
复制
SELECT * FROM books WHERE title MATCH 'linux';

对于所有列中的都是这样的:

代码语言:javascript
运行
复制
SELECT * FROM books WHERE books MATCH 'linux';

使用sqlalchemy,这需要“文本sql”(7/orm/tutorial.html#using-literal-sql),因为图书列不存在。

代码语言:javascript
运行
复制
Session.query(Book).filter(Book.books.match(u'linux')).all()
*** AttributeError: type object 'Book' has no attribute 'books'

Session.query(Book).filter('books match :text').params(text=u'linux').all()

在sqlite中,我们还可以在任何其他专栏中搜索标题为“linux”和“驱动程序”的书籍:

代码语言:javascript
运行
复制
SELECT * FROM books WHERE books MATCH 'title:linux driver';

通过sqlalchemy,它的工作方式应该是这样:

代码语言:javascript
运行
复制
Session.query(Book).filter('books MATCH title:title :text').params(title='linux', text='driver').all()

不幸的是,这会导致一个错误:

代码语言:javascript
运行
复制
*** OperationalError: (OperationalError) near ":title": syntax error u'SELECT ...\nFROM books \nWHERE books MATCH title:title ?' ('driver',)

我试着用title\::titletitle:::title来逃避冒号,但没有成功。

使用sqlalchemy 0.7

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-21 13:05:51

MATCH需要一个字符串。

如果您有多个字符串,则必须将它们连接起来。在SQL中,如下所示:

代码语言:javascript
运行
复制
... WHERE books MATCH 'title:' || 'linux' || ' ' || 'driver'

在SQLAlchemy中,应该这样写:

代码语言:javascript
运行
复制
...filter("books MATCH 'title:' || :title || ' ' || :text").params(...)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21258527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档