Подтвердить что ты не робот

В чем разница между session.commit() и session.flush()?

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

4b9b3361

Ответ 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/...