4

任何人都知道我如何在 SQLAlchemy 中使用 REGEXP_LIKE 的等价物?例如,我希望能够执行以下操作:

sa.Session.query(sa.Table).filter(sa.Table.field.like(regex-to match))

谢谢你的帮助!

4

3 回答 3

5

它应该(我无法访问 Oracle)像这样工作:

sa.Session.query(sa.Table) \
          .filter(sa.func.REGEXP_LIKE(sa.Table.c.column, '[[:digit:]]'))
于 2013-02-07T12:01:32.547 回答
1

如果您需要执行 SQLAlchemy 不支持的数据库特定功能,您可以使用文字过滤器。所以你仍然可以使用 SQLAlchemy 为你构建查询 - 即注意连接等。

这是如何将文字过滤器与 PostgreSQL 正则表达式匹配运算符放在一起的示例~

session.query(sa.Table).filter("%s ~':regex_pattern'" % sa.Table.c.column.name).params(regex_pattern='stack')

或者您可以手动将表和列指定为文字字符串的一部分,以避免出现模棱两可的列名大小写

session.query(sa.Table).filter("table.column ~':regex_pattern'"  ).params(regex_pattern='[123]')
于 2013-02-07T15:54:49.200 回答
0

这不是完全可移植的,但这是一个使用 ~ 运算符的 Postgres 解决方案。因此,我们可以使用任意运算符:

sa.Session.query(sa.Table).filter(sa.Table.field.op('~', is_comparison=True)(regex-to match))

或者,假设默认优先级为 0,

sa.Session.query(sa.Table).filter(sa.Table.field.op('~', 0, True)(regex-to match))

这也适用于 ORM 构造:

sa.Session.query(SomeClass).filter(SomeClass.field.op('~', 0, True)(regex-to match))

于 2017-09-30T12:48:35.833 回答