我有一个带有表“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\::title
或 title::title
来转义冒号,但没有成功。
使用 sqlalchemy 0.7
MATCH 需要一个字符串。
如果您有多个字符串,则必须将它们连接起来。在 SQL 中,这看起来像这样:
... WHERE books MATCH 'title:' || 'linux' || ' ' || 'driver'
在SQLAlchemy中,应该这样写:
...filter("books MATCH 'title:' || :title || ' ' || :text").params(...)
我是一名优秀的程序员,十分优秀!