Добавить и обновить с sqlalchemy в одном коммите

Я новичок в sqlalchemy. Я хочу сделать добавить и обновить в одной транзакции для той же модели. Фрагмент кода ниже. Ошибка генерирования приложения, такая как объект 'Session', не имеет атрибута 'update'

current_date = datetime.datetime.now()
try:
    session = Session()
    user = UserProvision()
    user.username = admin["username"]
    user.password= admin["password"]
    user.client_id= admin["client_id"]
    user.fname= admin["fname"]
    user.lname= admin['lname']
    user.phone= admin['phone']
    session.add(user)
    session.flush()
    user_id = user.user_id
    user.name = admin["fname"]+" "+admin["lname"]
    user.setCreated_by=user_id
    user.setModified_by=user_id
    user.setCreated_name=admin["fname"]+" "+admin["lname"]
    user.setModified_name=admin["fname"]+" "+admin["lname"]
    user.setLast_reset_date=current_date
    user.setLast_reset_by = current_date
    session.update(user)
    session.flush()
    session.commit()
except Exception as ex:
    print ex.__str__()
finally:
    session.close()

1 ответ

Когда вы добавили объект модели в сеанс, его состояние уже отслеживается на предмет изменений. Нет необходимости явно помечать его как обновленный, и, как вы заметили, такого метода не существует Session.update(), Просто удалите эту строку, и ваш код должен работать как положено.

Отслеживание достигается с помощью инструментов атрибутов класса модели:

Процесс сопоставления SQLAlchemy, помимо прочего, добавляет дескрипторы с включенной базой данных в сопоставляемый класс, каждый из которых представляет определенный столбец базы данных или отношение к связанному классу.

Другими словами, когда ваш класс модели построен Column атрибуты будут заменены на InstrumentedAttribute экземпляры дескриптора, которые, помимо прочего, отслеживают изменения значения.

Обратите внимание, что нет необходимости вручную очищать перед Session.commit():

Сбросить ожидающие изменения и зафиксировать текущую транзакцию.

Другие вопросы по тегам