SQLAlchemy将LIKE的通配符用于更新语句

时间:2011-10-26 10:25:06

标签: regex sqlalchemy sql-like

我需要在更新语句中使用ilike,但在尝试时会返回此错误:

  

InvalidRequestError:无法评估Python中的当前条件。为synchronize_session参数指定'fetch'或False。

代码:

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

我可以使用像regexp_replace这样的东西,但它有点矫枉过正。我只是希望更新能够适应不区分大小写和两端的空格。

2 个答案:

答案 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()