Кто-нибудь знает, какое основное различие между session.commit() и session.flush() в SQLAlchemy есть?
В чем разница между session.commit() и session.flush()?
Ответ 1
Вот некоторые релевантные цитаты из документации.
вровень
Когда
Sessionиспользуется с его конфигурацией по умолчанию, флеш шаг почти всегда выполняется прозрачно. В частности, флеш происходит до того, как выдается какой-либо отдельный запрос, а также в течениеcommit()перед транзакцией.
фиксации
commit()используется для фиксации текущей транзакции. Он всегда выдаетflush(), чтобы очистить любое оставшееся состояние до базы данных; это не зависит от настройки "автозапуска". Если транзакция не выполняется присутствует, возникает ошибка. Обратите внимание, что поведение по умолчанию для Сессия заключается в том, что всегда присутствует "транзакция"; это поведение может отключите установкуautocommit=True. В режиме автосохранения транзакция может быть инициирована вызовом методаbegin().
Ответ 2
Самый простой способ узнать, как это объяснить, просто показать вам, используя echo=True:
>>> session.flush()
BEGIN (implicit)
INSERT INTO users (username, password) VALUES (?, ?)
('alice', None)
>>> session.commit()
COMMIT
>>>
flush() приводит к отправке данных в базу данных. commit() вызывает COMMIT, который сообщает базе данных о сохранении только что отправленных данных. Как указывали другие, commit() также приведет к возникновению flush(), если это необходимо.
Ответ 3
Прямо от документация:
commit()используется для фиксации текущей транзакции. Он всегда выдаетflush()заранее, чтобы очистить любое оставшееся состояние до базы данных.
Ответ 4
Хотя приведенные выше ответы верны, наиболее полезной особенностью флеша является внесение изменений, внесенных в таблицу в базе данных обратно в соответствующий объект в коде. Вот пример, Предположим, вы зарегистрировали пользователя и хотите вернуть его id,
u = User(name,address,phone) #id is autogenerated
session.add(u)
session.commit() #calls flush beforehand, but we need it after the commit
session.flush() #updates the objects of the session
print(u.id) #id field of the User object updated after the flush
Вам не нужно снова запрашивать его идентификатор! Надеюсь, что это поможет
Ответ 5
flush()синхронизирует вашу базу данных с текущим состоянием объекта/объектов, хранящихся в памяти, но не совершает транзакцию. Итак, если вы получите какое-либо исключение после вызоваflush(), то транзакция будет отменена. Вы можете синхронизировать свою базу данных с небольшими фрагментами данных, используяflush(), вместо того, чтобы делать большие данные одновременно с помощьюcommit()и сталкиваться с риском получения исключенияOut Of Memory.
commit()сделает данные, хранящиеся в базе данных постоянными. Вы не можете отменить свою транзакцию после успешного завершенияcommit().
Источник: fooobar.com/info/112483/...