使用SQLAlchemy,可以轻松获取给定列以给定字符串开头的所有行。但是我如何翻转它以便我得到字符串开头与列匹配的行?
即,如果字符串是“stackoverflow”,我希望它匹配一个值为“stack”的行
如果有必要,我可以在列中存储正则表达式而不仅仅是字符串,但我不知道如何反转正则表达式比较。
答案 0 :(得分:2)
这是SQL solution实现为sqlalchemy表达式
class Foo(Base):
__tablename__="foo_tablename"
bar = Column(String(80))
bar = 'stackoverflow'
session.query(Foo).filter(literal('stackoverflow').like(func.concat(Foo.bar, '%')))
SQLAlchey日志显示生成的查询:
>>INFO sqlalchemy.engine.base.Engine SELECT bar FROM foo_tablename WHERE :param1 LIKE CONCAT(foo_tablename.bar_column,'%')
>>INFO sqlalchemy.engine.base.Engine {'param1': 'stack'}
请注意:
因此,如果我需要在生产中添加此类功能,我会考虑使用数据库提供的全文搜索功能。 SQLAlchemy不提供对全文搜索的支持,因为它是特定于数据库的功能。请参阅combining PostgreSQL full text search with SQLAlchemy的示例。
<强>更新强>
用户Audrius Kažukauskas建议如何摆脱原始sql。因此,这消除了using literal SQL的限制。
答案 1 :(得分:0)
也许有更好的方法,但这应该有效:
bar = 'stackoverflow'
session.query(Foo).filter(
Foo.data.in_([bar[:i] for i in xrange(5, len(bar) + 1)])
)