SQLAlchemy с использованием подстановочных знаков или ILIKE для обновления статистики - PullRequest
0 голосов
/ 26 октября 2011

Мне нужно использовать ilike в операторе обновления, но он возвращает эту ошибку, когда я пытаюсь:

InvalidRequestError: Не удалось оценить текущие критерии в Python.Укажите «fetch» ​​или False для параметра synchronize_session.

для этого кода:

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

Я мог бы использовать что-то вроде regexp_replace, но это немного излишне.Я просто хочу, чтобы обновление учитывало регистронезависимость и пробелы на обоих концах.

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Хорошо, это расстраивает!

Простой обходной путь, который я нашел, был следующим:

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()
1 голос
/ 26 октября 2011

Попробуйте:

# 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)
...