Transactions

Transaction

For each committed transaction SQLAlchemy-Continuum creates a new Transaction record.

Transaction can be queried just like any other sqlalchemy declarative model.

from sqlalchemy_continuum import transaction_class
Transaction = transaction_class(Article)

# find all transactions
session.query(Transaction).all()

UnitOfWork

For each database connection SQLAlchemy-Continuum creates an internal UnitOfWork object. Normally these objects are created at before flush phase of session workflow. However you can also force create unit of work before this phase.

uow = versioning_manager.unit_of_work(session)

Transaction objects are normally created automatically at before flush phase. If you need access to transaction object before the flush phase begins you can do so by calling the create_transaction method of the UnitOfWork class.

transaction = uow.create_transaction(session)

The version objects are normally created during the after flush phase but you can also force create those at any time by calling make_versions method.

uow.make_versions(session)

Workflow internals

Consider the following code snippet where we create a new article.

article = Article()
article.name = u'Some article'
article.content = u'Some content'
session.add(article)
session.commit()

This would execute the following SQL queries (on PostgreSQL)

  1. INSERT INTO article (name, content) VALUES (?, ?)
    params: (‘Some article’, ‘Some content’)
  2. INSERT INTO transaction (issued_at) VALUES (?)
    params: (datetime.utcnow())
  3. INSERT INTO article_version (id, name, content, transaction_id) VALUES (?, ?, ?, ?)
    params: (<article id from query 1>, ‘Some article’, ‘Some content’, <transaction id from query 2>)