我需要在更新语句中使用ilike
,但在尝试时会返回此错误:
InvalidRequestError:无法评估Python中的当前条件。为synchronize_session参数指定'fetch'或False。
代码:
meta.Session.query(i.mappedClass).filter(getattr(i.mappedClass, j).ilike("%"+userid+"%")).update({j:newUserId})
我可以使用像regexp_replace这样的东西,但它有点矫枉过正。我只是希望更新能够适应不区分大小写和两端的空格。
答案 0 :(得分: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)
答案 1 :(得分: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()