【发布时间】:2013-02-07 11:46:58
【问题描述】:
任何人都知道我如何在 SQLAlchemy 中使用 REGEXP_LIKE 的等价物?例如,我希望能够执行以下操作:
sa.Session.query(sa.Table).filter(sa.Table.field.like(regex-to match))
感谢您的帮助!
【问题讨论】:
标签: sql sqlalchemy
任何人都知道我如何在 SQLAlchemy 中使用 REGEXP_LIKE 的等价物?例如,我希望能够执行以下操作:
sa.Session.query(sa.Table).filter(sa.Table.field.like(regex-to match))
感谢您的帮助!
【问题讨论】:
标签: sql sqlalchemy
它应该(我无法访问 Oracle)像这样工作:
sa.Session.query(sa.Table) \
.filter(sa.func.REGEXP_LIKE(sa.Table.c.column, '[[:digit:]]'))
【讨论】:
REGEXP_LIKE 是特定于 Oracle 的。尽管 SQLAlchemy 非常努力地尝试与数据库无关,但不幸的是它并不适用于特殊功能。
如果您需要执行 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]')
【讨论】:
sa.Table 类型,有不同的方法来获取列。如果是Table(..),那么用户sa.Table.c.column.name。如果是映射对象,则只需 sa.Table.column.name
obj.nome),但对于表对象,您需要使用列:obj.c.nome。
这不是完全可移植的,但这是一个使用 ~ 运算符的 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))
【讨论】: