获取所有字符串以列值开头的行
使用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的限制。