Добавить и обновить с 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()
:
Сбросить ожидающие изменения и зафиксировать текущую транзакцию.