В чем разница между session.commit () и session.flush ()? - PullRequest
19 голосов
/ 19 сентября 2011

Кто-нибудь знает, в чем главное отличие session.commit() и session.flush() в SQLAlchemy?

Ответы [ 5 ]

15 голосов
/ 19 сентября 2011

Вот некоторые соответствующие цитаты из документации .

вровень

Когда Session используется с конфигурацией по умолчанию, сброс шаг почти всегда делается прозрачно. В частности, флеш происходит до выдачи отдельного запроса, а также внутри commit() вызов до совершения транзакции .

совершить

commit() используется для фиксации текущей транзакции. всегда выдает flush() заранее сбросить все оставшиеся состояния в базу данных ; этот не зависит от настройки «автоматической промывки». Если нет транзакции В настоящее время возникает ошибка. Обратите внимание, что поведение по умолчанию Сессия в том, что «транзакция» всегда присутствует; такое поведение может отключить, установив autocommit=True. В режиме автоматической фиксации Транзакция может быть инициирована путем вызова метода begin().

10 голосов
/ 19 сентября 2011

Самый простой способ, которым я знаю, как объяснить, что они делают, это просто показать вам, используя echo=True:

>>> session.flush()
BEGIN (implicit)
INSERT INTO users (username, password) VALUES (?, ?)
('alice', None)
>>> session.commit()
COMMIT
>>> 

flush(), и данные отправляются в базу данных.commit() вызывает COMMIT, который указывает базе данных сохранить только что отправленные данные.Как уже говорили другие, commit() также вызовет flush(), если это необходимо.

4 голосов
/ 19 сентября 2011

Прямо из документация :

commit() используется для фиксации текущей транзакции.Всегда заранее выдается flush() для сброса любого оставшегося состояния в базу данных.

3 голосов
/ 10 февраля 2017

Хотя приведенные выше ответы верны, наиболее полезная функция flush заключается в применении изменений, внесенных в таблицу в базе данных, обратно в соответствующий объект в коде.Вот пример: предположим, что вы зарегистрировали пользователя и хотите вернуть его идентификатор,

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

Вам не нужно запрашивать снова, чтобы получить его идентификатор !!Надеюсь, это поможет

0 голосов
/ 15 октября 2017

flush() синхронизирует вашу базу данных с текущим состоянием объекта / объектов, находящихся в памяти, но не фиксирует транзакцию. Таким образом, если вы получите какое-либо исключение после вызова flush(), транзакция будет откатана. Вы можете синхронизировать свою базу данных с небольшими порциями данных, используя flush() вместо одновременной фиксации больших данных с помощью commit() и рискуя получить исключение Out Of Memory.

commit() сделает данные, хранящиеся в базе данных, постоянными. Невозможно откатить транзакцию после успешного выполнения commit().

Источник: https://stackoverflow.com/a/26976077/4115031

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...