使用 SQLAlchemy,很容易获取给定列以给定字符串开头的所有行。但是如何翻转它,以便获得字符串开头与列匹配的行?
即,如果字符串是“stackoverflow”,我希望它与值为“stack”的行匹配
如有必要,我可以将正则表达式存储在列中,而不仅仅是字符串,但我也不知道如何反转正则表达式比较。
使用 SQLAlchemy,很容易获取给定列以给定字符串开头的所有行。但是如何翻转它,以便获得字符串开头与列匹配的行?
即,如果字符串是“stackoverflow”,我希望它与值为“stack”的行匹配
如有必要,我可以将正则表达式存储在列中,而不仅仅是字符串,但我也不知道如何反转正则表达式比较。
这是实现为 sqlalchemy 表达式的SQL 解决方案
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 不支持全文搜索,因为它是特定于数据库的功能。请参阅将 PostgreSQL 全文搜索与 SQLAlchemy 相结合的示例。
更新
用户Audrius Kažukauskas建议如何摆脱原始 sql。所以这消除了使用文字 SQL的限制。
也许有更好的方法,但这应该有效:
bar = 'stackoverflow'
session.query(Foo).filter(
Foo.data.in_([bar[:i] for i in xrange(5, len(bar) + 1)])
)