В SQLAlchemy flush()и commit()— это два метода, используемые для синхронизации изменений, внесенных в объекты в памяти, с базой данных. Вот разница между ними:
-
flush(): методflush()используется для записи любых ожидающих изменений в базу данных без завершения текущей транзакции. Он синхронизирует состояние объектов в памяти с базой данных, но транзакция не завершается. Это означает, что изменения видны другим частям приложения в рамках той же транзакции, но они не сохраняются в базе данных навсегда до тех пор, пока не будет вызвана последующая функцияcommit(). -
commit(): методcommit()используется для сохранения всех ожидающих изменений в базе данных и завершения текущей транзакции. Он постоянно записывает изменения, внесенные в объекты в памяти, в базу данных, делая их видимыми для других транзакций. После вызоваcommit()изменения невозможно отменить, если у вас нет резервной копии или предыдущей транзакции.
Вот пример, иллюстрирующий использование flush()и commit():
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# Create an engine and session
engine = create_engine('sqlite:///example.db')
Session = sessionmaker(bind=engine)
session = Session()
# Create a new object
new_object = MyObject(name='Example')
# Add the object to the session
session.add(new_object)
# Flush the changes (not committed yet)
session.flush()
# The object is now visible within the same transaction
print(new_object.id) # Output: 1
# Commit the changes
session.commit()
# The object is now permanently saved to the database
print(new_object.id) # Output: 1 (same as before)
# Close the session
session.close()
В этом примере flush()используется для синхронизации new_objectс базой данных, делая его доступным в рамках одной транзакции. После вызова commit()изменения навсегда сохраняются в базе данных.