【问题标题】:REGEXP_LIKE in SQLAlchemySQLAlchemy 中的 REGEXP_LIKE
【发布时间】:2013-02-07 11:46:58
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

    标签: sql sqlalchemy


    【解决方案1】:

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

    sa.Session.query(sa.Table) \
              .filter(sa.func.REGEXP_LIKE(sa.Table.c.column, '[[:digit:]]'))
    

    【讨论】:

    • func 没有名为 REGEXP_LIKE 的属性。还有.c.column的含义是什么?这是要成为领域吗?我试过 .field 和 .field.column 但都没有工作
    • 你用的是什么数据库?
    • PostgreSql... 但 sqlAlchemy 不是独立于数据库的吗?
    • 哦.. REGEXP_LIKE 是特定于 Oracle 的。尽管 SQLAlchemy 非常努力地尝试与数据库无关,但不幸的是它并不适用于特殊功能。
    • 是的,好像PostgreSQL支持的正则表达式匹配大部分是not supported yet by SQLAlchemy
    【解决方案2】:

    如果您需要执行 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]')
    

    【讨论】:

    • 对不起,但您的回答在 regex_pattern 处给了我一个错误。括号是否正确? table.column 是否正确?不应该是 sa.Table.column 吗?在任何情况下,即使以这种方式收到错误,但我无法判断错误是什么,它只会在“1”或附近显示 (ProgrammingError) 语法错误
    • 抱歉有错别字。 regex_pattern 后面不应该有括号。请查看更新版本。还取决于sa.Table 类型,有不同的方法来获取列。如果是Table(..),那么用户sa.Table.c.column.name。如果是映射对象,则只需 sa.Table.column.name
    • 对不起,我不明白,这是我的查询:sa.Session.query(sa.BaseApparati).filter("sa.BaseApparati.column.nome ~':regex_pattern' " ).params(regex_pattern='[123]').all()。表的名称是“BaseApparati”,列的名称是“nome”,正确的输入是什么?我仍然收到“编程错误...”。谢谢
    • 您似乎对表对象和ORM对象有混淆。在您的 ORM 模型中,您可以访问字段 (obj.nome),但对于表对象,您需要使用列:obj.c.nome
    【解决方案3】:

    这不是完全可移植的,但这是一个使用 ~ 运算符的 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))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多