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