2013-02-07 32 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))