9

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

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?

4

1 回答 1

15

如果将path变量包装在bindparam()对象中,则可以将其视为任何列,包括使用.contains()and.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))
于 2012-11-01T11:57:21.093 回答