我的远程目标是使用MySQL全文索引......但最近的问题是将text
的使用与SQLAlchemy ORM相结合。
假设我们已经从声明基础继承了User
类,并在MySQL列name
上定义了全文索引。这有什么作用:
from sqlalchemy import text
full_text = text('MATCH(name) AGAINST(\":name\") > :value')
filter_arg = full_text.params(name="John Jacob Jingleheimer Schmidt", value=1)
session.query(User).filter(filter_arg)
正如docs中所述,text
与filter
和order_by
一起使用非常简单。我想实际选择值。我想做这个完全虚假的代码似乎应该实现的目标:
full_text = text('MATCH(name) AGAINST(\":name\")')
value = full_text.params(name="John Jacob Jingleheimer Schmidt")
session.query(User, value)
显然,这不起作用,但我希望它足够清楚暗示目标?
答案 0 :(得分:0)
Column.match
函数应该完成这项工作:
xpr = User.name.match("John Jacob Jingleheimer Schmidt").label("match_result")
q = session.query(User, xpr)
事实上,在不使用text()
的情况下,包含where子句的整个查询表达得更好:
xpr = User.name.match("John Jacob Jingleheimer Schmidt").label("match_result")
q = session.query(User, xpr).filter(xpr > 1)
答案 1 :(得分:0)
添加到接受的答案,对于MySQL后端,您可能需要以下解决方法。
from sqlalchemy import type_coerce, Float
result = session.query(User, type_coerce(xpr, Float)).all()