Proposed database changes are not immediately committed to the database once they’re defined.
Changes go through stages in order to provide the ability to “undo” a mistake before committing it to a database.
Flush
- A flush is an event that takes pending changes and translates them into SQL commands, ready to be committed to the database.
- On INSERTS, a flush allows (future) primary key values to exist.
- Not the same as a commit
- Nothing is persisted to the database yet when a flush happens.
- Within a session, we create transactions every time we want to commit work to the database.
- Proposed changes are not immediately committed to the database and instead go through stages to allow for undos.
- The ability to undo is allowed via db.session.rollback()
Stages:
- Transient: an object exists, it was defined.
user1 = User(name='Amy')
- Pending: an object was attacked to a session. “Undo” becomes available via db.session.rollback(). Waits for a flush to happen.
db.session.add(widget)
db.session.delete(widge)
widget.name = 'foo'
- Flushed: about ready to be committed to the database, translating actions into SQL command statements for the engine. Whenever query is invoked, a flush occurs to execute that query. A flush also occurs on commit()
Person.query.all()
db.session.commit()
Person.query.filter_by(name='bob')
Person.query.first().delete()
- Committed: manually called for a change to persist to the database (permanently); session’s transaction is cleared for a new set of changes. Commit will automatically flush pending changes for you.