Объект Session - это, по сути, текущая транзакция изменений базы данных (обновление, вставка, удаление). Эти операции не сохраняются в базе данных до тех пор, пока они не будут зафиксированы (если ваша программа по какой-то причине прерывается во время транзакции в середине сеанса, все незафиксированные изменения внутри нее теряются).
Объект сеанса регистрирует транзакции с помощью session.add()
, но еще не передает их в базу данных, пока не будет вызван session.flush()
.
session.flush()
передает серию операций в базу данных (вставка, обновление, удаление). База данных поддерживает их как ожидающие операции в транзакции. Изменения не сохраняются постоянно на диске или не видны другим транзакциям, пока база данных не получит COMMIT для текущей транзакции (что и делает session.commit()
).
session.commit()
фиксирует (сохраняет) эти изменения в базе данных.
flush()
- это всегда , вызываемый как часть вызова commit()
( 1 ).
Когда вы используете объект Session для запроса к базе данных, запрос будет возвращать результаты как из базы данных, так и из очищенных частей незафиксированной транзакции, которую он содержит. По умолчанию объекты Session autoflush
выполняют свои операции, но это можно отключить.
Надеюсь, этот пример прояснит ситуацию:
#---
s = Session()
s.add(Foo('A')) # The Foo('A') object has been added to the session.
# It has not been committed to the database yet,
# but is returned as part of a query.
print 1, s.query(Foo).all()
s.commit()
#---
s2 = Session()
s2.autoflush = False
s2.add(Foo('B'))
print 2, s2.query(Foo).all() # The Foo('B') object is *not* returned
# as part of this query because it hasn't
# been flushed yet.
s2.flush() # Now, Foo('B') is in the same state as
# Foo('A') was above.
print 3, s2.query(Foo).all()
s2.rollback() # Foo('B') has not been committed, and rolling
# back the session's transaction removes it
# from the session.
print 4, s2.query(Foo).all()
#---
Output:
1 [<Foo('A')>]
2 [<Foo('A')>]
3 [<Foo('A')>, <Foo('B')>]
4 [<Foo('A')>]