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

2 投票
2 回答
1312 浏览
提问于 2025-04-17 13:39

使用SQLAlchemy时,我们可以很简单地找到某一列中以特定字符串开头的所有行。但是,如果我想反过来,找出那些以某个字符串开头的行,该怎么做呢?

比如说,如果我的字符串是“stackoverflow”,我希望找到值为“stack”的那一行。

如果需要的话,我可以在列中存储正则表达式,而不仅仅是字符串,但我也不知道怎么反转正则表达式的比较。

2 个回答

0

也许还有更好的方法,但这个方法应该可以用:

bar = 'stackoverflow'
session.query(Foo).filter(
    Foo.data.in_([bar[:i] for i in xrange(5, len(bar) + 1)])
)
2

这里有一个用SQL解决方案,它是通过SQLAlchemy表达式实现的。

class Foo(Base):
    __tablename__="foo_tablename"
    bar = Column(String(80))

bar = 'stackoverflow'
session.query(Foo).filter(literal('stackoverflow').like(func.concat(Foo.bar, '%')))

SQLAlchemy的日志显示了生成的查询:

>>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的限制。

撰写回答