Python'始于'与SqlAlchemy等效

The*_*One 7 python sqlalchemy

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

path = '/abc/123/456'
session.query(Site).filter(path.startswith(Site.path_prefix))
Run Code Online (Sandbox Code Playgroud)

当path_prefix等于时,以下记录将匹配:

/abc
/ab
/abc/123
Run Code Online (Sandbox Code Playgroud)

但不是:

/asd
/abc/123/456/789
/kjk
Run Code Online (Sandbox Code Playgroud)

这可能与SqlAlchemy,而不切换到python?

Mar*_*ers 11

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

from sqlalchemy.sql.expression import bindparam

session.query(Site).filter(bindparam('path', path).contains(Site.path_prefix))
Run Code Online (Sandbox Code Playgroud)

SQLAlchemy转换.contains()为:

? LIKE CONCAT('%', Site.path_prefix, '%')
Run Code Online (Sandbox Code Playgroud)

在MySQL或

? LIKE '%' || Site.path_prefix || '%'
Run Code Online (Sandbox Code Playgroud)

在其他数据库上.

如果你想测试一个.startswith()操作,那也是有效的:

from sqlalchemy.sql.expression import bindparam

session.query(Site).filter(bindparam('path', path).startswith(Site.path_prefix))
Run Code Online (Sandbox Code Playgroud)