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

これは、Pythonに切り替えることなくSqlAlchemyで可能ですか?

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 に答える