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

时间:2014-01-21 12:43:51

标签: 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这需要“literal 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

1 个答案:

答案 0 :(得分:2)

MATCH需要一个字符串。

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

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

在SQLAlchemy中,这应该是这样写的:

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