获取字符串以列值开头的所有行

时间:2013-01-25 15:16:34

标签: python sqlalchemy

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

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

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

2 个答案:

答案 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'}

请注意:

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

因此,如果我需要在生产中添加此类功能,我会考虑使用数据库提供的全文搜索功能。 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)])
)