Как получить количество строк, затронутых SQL Alchemy?

Как получить количество затронутых строк для оператора обновления с помощью sqlalchemy? (Я использую mysql и python/pyramid):

from sqlalchemy.engine.base import ResultProxy

@classmethod
def myupdate(cls, id, myvalue):
    DBSession.query(cls).filter(cls.id == id).update({'mycolumn': myvalue})
    if ResultProxy.rowcount == 1:
        return True
    else:
        return False

Примечание. Я видел этот пост, но согласно документы: "The 'rowcount' сообщает количество строк, соответствующих критерию WHERE оператора UPDATE или DELETE."....другими словами, он не возвращает количество строк, затронутых обновлением или удалить заявление.


person user_78361084    schedule 10.10.2012    source источник


Ответы (1)


Вы можете переопределить это поведение, указав правильный параметр для DBAPI в соответствии с документ.

У меня нет mysql, готового для тестирования, но я думаю, что добавление правильной опции (либо client_flag, либо found_rows=False в зависимости от используемого API) к URL-адресу конфигурации должно помочь. Проверьте соответствующий источник для mysqlconnector и oursql для получения дополнительной информации.

Я надеюсь, что этого будет достаточно, чтобы помочь вам.

person madjar    schedule 10.10.2012
comment
пытаясь понять это. Я понятия не имею, где бы я изменил это. Я новичок в пирамидах, sqlalchemy и python. - person user_78361084; 14.10.2012
comment
у вас есть где-то URL-адрес конфигурации для базы данных, что-то вроде mysql+mysqlconnector://user:passwd@host/db, вы можете добавить некоторые аргументы в конце, как в запросе на получение: mysql+mysqlconnector://user:passwd@host/db?found_rows=False - person madjar; 14.10.2012
comment
Я получаю сообщение об ошибке: 'found_rows' является недопустимым аргументом ключевого слова для этой функции Нет Нет - person user_78361084; 16.10.2012
comment
О, извините, кажется, я перепутал эти два. Не могли бы вы попробовать mysql+oursql://user:passwd@host/db?found_rows=False ? - person madjar; 16.10.2012
comment
добавил это, но добавление нашего sql делает любые запросы медленнее. Я пытался протестировать его, но разочарован медлительностью. Настройка found_rows=False, похоже, не помогает. - person user_78361084; 18.10.2012
comment
Это должно быть потому, что вы теперь используете другой DBAPI. Если это действительно медленно, будет ли восстановление исходной конфигурации и добавление DBSession.query(cls).filter(cls.id == id).filter(cls.mycolumn != myvalue).count() запросов быстрее? (Вероятно, вы можете учесть два запроса в одной функции, если хотите избежать дублирования кода). - person madjar; 23.10.2012