python - 如何在 sqlalchemy 中使用 SQLite fts MATCH 查询

标签 python sqlite sqlalchemy

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

sqlalchemy 已设置,因此我可以像这样查询数据库:

Session.query(Book).filter(Book.title.like(u'%linux%')).all()

由于该表是支持 fts4 ( http://www.sqlite.org/fts3.html#section_3 ) 的虚拟表,我们可以像这样搜索整个单词

SELECT * FROM books WHERE title MATCH 'linux';

对于所有列中的整个单词,如下所示:

SELECT * FROM books WHERE books MATCH 'linux';

使用 sqlalchemy 这需要“文字 sql”( http://docs.sqlalchemy.org/en/rel_0_7/orm/tutorial.html#using-literal-sql ),因为 books 列不存在

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”和“driver”的书籍:

SELECT * FROM books WHERE books MATCH 'title:linux driver';

通过 sqlalchemy 这应该以某种方式工作::

Session.query(Book).filter('books MATCH title:title :text').params(title='linux', text='driver').all()

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

*** OperationalError: (OperationalError) near ":title": syntax error u'SELECT ...\nFROM books \nWHERE books MATCH title:title ?' ('driver',)

我尝试使用 title\::titletitle:::title 转义冒号,但未能成功。

使用sqlalchemy 0.7

最佳答案

MATCH 需要一个字符串。

如果有多个字符串,则必须将它们连接起来。 在 SQL 中,这看起来像这样:

... WHERE books MATCH 'title:' || 'linux' || ' ' || 'driver'

在 SQLAlchemy 中,应该这样写:

...filter("books MATCH 'title:' || :title || ' ' || :text").params(...)

关于python - 如何在 sqlalchemy 中使用 SQLite fts MATCH 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21258527/

相关文章:

python - 索引错误 : list index out of range - cannot reason the logic

python - 一个函数应该打印一个字符串还是返回它?

mysql - 使用 int 和 char(32) 的 PK 性能

android - 单击按钮时将 TextView 文本插入 SQLite

python - SQLAlchemy 与 MemSQL 上的语法错误

python - 复制列表中的元素 x 次

java - 将数据数组保存到数据库

python - psycopg2 的 fast_executemany 替代方案

python - MySQL全文搜索与SQLAlchemy的正确使用

python - 重写 get_queryset 会导致 ListView 中的缓存问题,其中数据仍然过时