2011-10-26 30 views
0

有沒有人有答案?使用通配符或ILIKE進行更新的SQLAlchemy

我需要在更新statment使用ILIKE但它返回時,我嘗試這個錯誤:

InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter. 

此代碼:

meta.Session.query(i.mappedClass).filter(getattr(i.mappedClass, j).ilike("%"+userid+"%")).update({j:newUserId}) 

我可以使用類似REGEXP_REPLACE但它有點矯枉過正。我只是希望更新能夠適應不區分大小寫和兩端的空格!

回答

1

好吧,這是令人沮喪的!

的簡單的解決方法,我發現是這樣的:

for i in model.dataTables: 
for j in i.idColumn: 
    rows = meta.Session.query(i.mappedClass).filter(getattr(i.mappedClass, j).ilike("%"+userid+"%")).all() 
    for row in rows: 
     setattr(row, j, newuserid) 
meta.Session.commit() 
+0

這不僅僅是一種解決方法,而是一種解決方法。您的第一種方法基本上是直接在SQL後端執行SQL UPDATE語句,而解決方法是將每行都作爲模型對象加載到內存中,然後將其更新到內存中,然後將更改提交到SQL後端。如果這是一種維護類型的操作,我認爲第一種方法仍然會更好,特別是如果'newuserid'可以通過SQL後端的'userid'計算。 – van

+0

我不想在每個循環上執行語句。第二種方式對我更好,因爲用戶無法通過更新中斷環路。 – JackalopeZero

1

試試這個:

# test columns 
userid = "dUmMy" 
j = "name" # name of the column 
mappedTable = i.mappedClass.__table__ # assuming use of Declarative. if not, mappedTable is the Table object mapped to i.mappedClass 
_stmt = (mappedTable.update().where(getattr(i.mappedClass, j).ilike("%"+ userid +"%")). 
      values({getattr(i.mappedClass, j): func.lower(getattr(i.mappedClass, j))}) 
     ) 
session.execute(_stmt) 

產生SQL:

UPDATE person SET name=lower(person.name) WHERE lower(person.name) LIKE lower(?) 

事實上,你可以只取出where條款更新表中的所有記錄:

_stmt = mappedTable.update().values({getattr(i.mappedClass, j): func.lower(getattr(i.mappedClass, j))}) 
session.execute(_stmt) 

產生像這樣的SQL:

UPDATE person SET name=lower(person.name) 
+0

理想,我想遠離session.execute了,但生病了你已與這裏給出圍繞什麼亂七八糟的,看看我能得到什麼 – JackalopeZero

+0

我不看看'session.execute()'是如何與'query(...)。update()'不同的? – van

+0

由於查詢處於循環狀態,並可能導致打開多個連接的問題 – JackalopeZero

相關問題