2011-02-07 100 views

回答

21

db.table.column.like('%needle%')篩選。對於不區分大小寫的搜索,還有ilike

對於一個發燒友界面,你可以允許已知的「dir」通配符。

if '*' in needle or '_' in needle: 
    looking_for = needle.replace('_', '__')\ 
         .replace('*', '%')\ 
         .replace('?', '_') 
else: 
    looking_for = '%{0}%'.format(needle) 

result = db.table.filter(db.table.column.ilike(looking_for)) 

注:

  • db.table.filterdb.table.columnSQLSoupSQLSoup如果數據庫是由另一個應用程序所做的是有用的)
  • 爲SQLAlchemy的核心是select(column_list).where(table.c.column.ilike(expr))。當您希望從原始SQL獲得所有權限時,無需使用字符串插值手動編寫語句(使用SQLSoup進行內省,因此您無需聲明表)
  • SQLAlchemy Declarative (中瓶使用的)是Model.query.filter(Model.field.ilike(expr))
+1

你能告訴我們在燒瓶SQLAlchemy的 – Wally 2015-01-05 13:15:25

+1

@Wally燒瓶SQLAlchemy的查詢是方便包連接到SQLAlchemy的燒瓶。與SQLAlchemy Declarative相比,查詢不會發生變化。 – Laogeodritt 2016-09-22 16:10:59

11

雖然table.c.column.like("%...%")應該工作,還有一個更直接的方式來表達你想要什麼:

table.c.column.contains("needle") 

這通常會產生相同的SQL查詢,但它更好地閱讀爲外行。 請注意,包含似乎不能逃脫「_」「%」

+0

像(%...%)不是直接的,不是 - 但我有一組表(模型),將field.contains(k)轉換爲字段LIKE'%%'|| k || '%%' - 沒有呈現正確的結果。 – shermy 2016-05-23 07:59:50

40

試試這個

Model.query.filter(Model.columnName.contains('sub_string')) 
相關問題