Кто-нибудь знает, какое основное различие между 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/...