2010-11-06 140 views
20

是否可以像session.query(MyObject).filter_by(REGEX)那樣使用正則表達式?SQLalchemy查詢中的正則表達式?

如果不是,我該如何使用sqlAlchemy檢索具有以特定值開始的varchar PK的記錄(例如,所有那些以爲城市字段以「SA」開頭的人)?謝謝。

+1

如果使用的是Oracle,你會想用這個答案http://stackoverflow.com/a/14750641/269834 – 2014-08-13 20:42:30

回答

23

我想我明白了:

session.query(Object).filter(Object.column.op('regexp')(REGEX)) 
+8

這個答案只適用於使用'REGEXP'作爲比較運算符的MySQL。您必須在其他數據庫中對其進行更改,如果數據庫具有正則表達式比較運算符(與例如函數相反),它將只能像這樣工作。在PostgreSQL中,你可以使用'op('〜')'。 – 2015-02-26 18:11:07

3

[免責聲明:無正則表達式]

我回答這個問題:「我怎麼能使用SQLAlchemy檢索具有一定的值開始一個varchar PK記錄」,因爲這個簡單的使用情況下,可能LIKE既便宜又便攜(要求正則表達式看起來像the XY Problem的表現)。

在SQLAlquemy(亞歷克斯借款):

session.query(Object).filter(Object.column.like('something%')) 

在SqlSoup我用:

db.table.filter(db.table.column.like('something%')) 
+2

爲什麼downvote?一個正則表達式顯然是矯枉過正的,用於測試一個字符串是否是「某些東西」。此外,並非每個數據庫都具有本機正則表達式支持,但每個SQL數據庫都支持「like」語句 - 服務器端操作總是更好。 – 2012-01-13 22:24:29

+0

因爲「喜歡」不如正則表達式... – Sylvestre 2015-01-21 16:07:42

+1

@Sylvestre ...而且方式更昂貴和便攜性更低。 – 2015-01-21 17:27:50

3

對於記錄,可以與Paulo Scardine在SQLAlchemy中的回答基本相同;

session.query(Object).filter(Object.column.like('something%')) 
+0

爲什麼downvote? *從字面上*我所做的只是提供一個SQLAlchemy翻譯來描述另一個答案。我並不是說它更好,甚至是我翻譯的答案是最好的解決方案。如果有錯誤的評論和正確(可能會有),但不要隨意donwvote! – Alex 2014-10-17 13:33:52

+1

這是一個'喜歡',而不是問題中所要求的'正則表達式'。 – 2016-01-25 09:02:31