2

使用 SQLAlchemy,很容易获取给定列以给定字符串开头的所有行。但是如何翻转它,以便获得字符串开头与列匹配的行?

即,如果字符串是“stackoverflow”,我希望它与值为“stack”的行匹配

如有必要,我可以将正则表达式存储在列中,而不仅仅是字符串,但我也不知道如何反转正则表达式比较。

4

2 回答 2

2

这是实现为 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'}

请注意:

  • 这种类型的 sql 查询会阻止数据库使用列索引 - 因此它是潜在的性能瓶颈。

因此,如果我需要将此类功能添加到生产中,我会考虑使用数据库提供的全文搜索功能。SQLAlchemy 不支持全文搜索,因为它是特定于数据库的功能。请参阅将 PostgreSQL 全文搜索与 SQLAlchemy 相结合的示例。

更新

用户Audrius Kažukauskas建议如何摆脱原始 sql。所以这消除了使用文字 SQL的限制。

于 2013-01-25T19:40:46.733 回答
0

也许有更好的方法,但这应该有效:

bar = 'stackoverflow'
session.query(Foo).filter(
    Foo.data.in_([bar[:i] for i in xrange(5, len(bar) + 1)])
)
于 2013-01-25T16:16:35.137 回答