2013-02-07 31 views
2

任何人都知道我怎么能在SQLAlchemy中使用REGEXP_LIKE的等价物?例如,我希望能够做到这样的事情:SQLAlchemy中的REGEXP_LIKE

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

感谢您的帮助!

回答

3

应该(我有Oracle中没有接入)的工作是这样的:

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

FUNC没有名为REGEXP_LIKE的属性。 .c.column的含义是什么?这是否意味着该领域?我尝试过.field和.field.column,但都没有工作 –

+0

您使用的是哪个数据库? – plaes

+0

PostgreSql ...但不是独立于数据库的sqlAlchemy? –

1

在情况下,当你需要做哪些不被支持的SQLAlchemy您可以使用文字过滤数据库中的特定功能。所以,你仍然可以使用SQLAlchemy为您打造查询 - 即约联接等照顾

下面是例子,如何放在一起的文字过滤与PostgreSQL的正则表达式匹配操作~

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

,或者你可以手动指定表和列作为文本字符串的一部分,以避免ambigious列名的情况下

session.query(sa.Table).filter("table.column ~':regex_pattern'" ).params(regex_pattern='[123]') 
+0

不好意思,但你的回答在regex_pattern给我一个错误。括号是否正确? table.column是否正确?它不应该是sa.Table.column?在任何情况下,即使以这种方式接收错误,但我无法知道错误是什么,它只在“1”处或附近说(编程错误)语法错误。 –

+0

对错字很抱歉。在regex_pattern之后不应该有括号。请参阅更新版本。还取决于''sa.Table''类型有不同的方式来获取列。如果它是“Table(..)”,则是用户“sa.Table.c.column.name”。如果它是映射对象,那么只是''sa.Table.column.name'' – vvladymyrov

+0

对不起,我不明白,这是我的查询:sa.Session.query(sa.BaseApparati).filter(“sa .BaseApparati.column.nome〜':regex_pattern'“).params(regex_pattern ='[123]')。all()。表的名称是“BaseApparati”,列的名称是“Nome”,那么正确的输入是什么?我仍然收到“编程错误...”。谢谢 –

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))