相当于使用`select()`和`text()`使用ORM?

时间:2014-12-03 04:01:31

标签: python mysql sqlalchemy

我的远程目标是使用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中所述,textfilterorder_by一起使用非常简单。我想实际选择值。我想做这个完全虚假的代码似乎应该实现的目标:

full_text = text('MATCH(name) AGAINST(\":name\")')
value = full_text.params(name="John Jacob Jingleheimer Schmidt") 
session.query(User, value)

显然,这不起作用,但我希望它足够清楚暗示目标?

2 个答案:

答案 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()

Source