Python'始于'与SqlAlchemy等效

时间:2012-11-01 11:39:49

标签: python sqlalchemy

我有一个字符串,我需要找到所有带有匹配前缀的记录:

path = '/abc/123/456'
session.query(Site).filter(path.startswith(Site.path_prefix))

当path_prefix等于:

时,以下记录将匹配
/abc
/ab
/abc/123

但不是:

/asd
/abc/123/456/789
/kjk

这是否可以使用SqlAlchemy,而无需切换到python?

1 个答案:

答案 0 :(得分:11)

如果您将path变量包装在bindparam() object中,则可以将其视为任何列,包括使用.contains().startswith()运算符:

from sqlalchemy.sql.expression import bindparam

session.query(Site).filter(bindparam('path', path).contains(Site.path_prefix))

SQLAlchemy将.contains()翻译为:

? LIKE CONCAT('%', Site.path_prefix, '%')

在MySQL或

? LIKE '%' || Site.path_prefix || '%'

在其他数据库上。

如果您想测试.startswith()操作,那也可以:

from sqlalchemy.sql.expression import bindparam

session.query(Site).filter(bindparam('path', path).startswith(Site.path_prefix))