我有一个字符串,我需要找到所有带有匹配前缀的记录:
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?
答案 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))