NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #4911 most downloaded on PyPI
Versioning and auditing extension for SQLAlchemy.
Last release 6 days ago
29 Sep 2026
Release timing varies
gaps range from 8 days to 1.3 years
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
13 years old
104 releases · first in 2013
SQLAlchemy 2.1 support. The supported range is now SQLAlchemy>=1.4.53,<2.2 . SQLAlchemy 2.1 requires Python 3.11+, so installs on Python 3.10 keep res
SQLAlchemy>=1.4.53,<2.2. SQLAlchemy 2.1 requires Python 3.11+, so installs on Python 3.10 keep resolving to SQLAlchemy 2.0.Transaction model no longer picks up stray registry, Base and user_cls class attributes when user_cls is configured. Transaction.registry shadowed the declarative registry, and SQLAlchemy 2.1 raises an SAWarning for it.generic_relationship (used by ActivityPlugin) no longer raises ValueError on SQLAlchemy pre-release versions such as 2.1.0rc2.count_versions() no longer flushes pending session changes on SQLAlchemy 2.1, which autoflushes textual SQL. The count matches SQLAlchemy 1.4 and 2.0.postgresql:// URLs to psycopg 3 instead of psycopg2. Install psycopg 3 (pip install "psycopg[binary]", or plain psycopg if the system libpq is available), or keep psycopg2 by using an explicit postgresql+psycopg2:// URL. Continuum, including native versioning, works with either driver.Full changelog: 1.7.0...1.8.0
One column per quarter.
Add support for SQLAlchemy 2.1 (supported range is now >=1.4.53,<2.2; SQLAlchemy 2.1 itself requires Python 3.11+)
Fix the Transaction model gaining stray registry, Base and user_cls class attributes when user_cls is configured; registry shadowed the declarative registry and raises an SAWarning on SQLAlchemy 2.1
Fix an exception during mapper configuration silently disabling version model building for every later configuration
Fix generic_relationship (used by ActivityPlugin) raising ValueError on SQLAlchemy pre-release versions such as 2.1.0rc2
count_versions() no longer flushes pending session changes on SQLAlchemy 2.1, which autoflushes textual SQL; the count matches 1.4 and 2.0
Python 3.9 support dropped (3.9 reached end-of-life in October 2025). The minimum supported Python is now 3.10.
[dependency-groups]; package extras are now user-facing only (flask, flask-login, flask-sqlalchemy). If you installed SQLAlchemy-Continuum[test], install the test dependency group instead.breakpoint() call in TransactionChangesPlugin.AttributeError in VersioningManager.append_association_operation.session.commit(article), sync_trigger(conn, ...), Transaction.query, create_session removed in SQLAlchemy 2.0); documented examples are now exercised by tests/test_user_guide_examples.py.OrderedDict).Full changelog: 1.6.0...1.7.0
Drop Python 3.9 support (EOL October 2025); the minimum supported Python is now 3.10
Modernize codebase to Python 3.10+ syntax (PEP 604 unions, built-in generics, plain dicts instead of OrderedDict)
Migrate documentation from Sphinx/reStructuredText to Zensical (Markdown + mkdocstrings)
Fix broken user guide examples (session.commit(article), sync_trigger(conn, ...), Transaction.query, create_session removed in SQLAlchemy 2.0) and add tests/test_user_guide_examples.py to keep documented examples working
Remove a leftover breakpoint() call in TransactionChangesPlugin
Fix latent AttributeError in VersioningManager.append_association_operation
Expand ruff lint rules (E/W/F/I/B/C4/UP) and drop the separate pyupgrade pre-commit hook
Move test/dev/docs dependencies to PEP 735 [dependency-groups]; package extras are now user-facing only (flask, flask-login, flask-sqlalchemy)
Publish to PyPI via GitHub Actions trusted publishing on GitHub releases
Add Dependabot (GitHub Actions, uv lockfile, pre-commit hooks), issue/PR templates, CONTRIBUTING.md and SECURITY.md
Add version_at() class method on version objects for efficient retrieval of the version active at a specific transaction
version_at() class method on version objects for efficient retrieval of the version active at a specific transaction (#376)all_versions() class method with link option to batch fetch all versions for an entity in a single query, avoiding N+1 queries by pre-populating previous/next navigation caches (#376)create_composite_index configuration option to control composite index creation (#376)Full Changelog: 1.5.2...1.6.0
Add version_at() class method on version objects for efficient retrieval of the version active at a specific transaction (#376)
Add all_versions() class method with link option to batch fetch all versions for an entity in a single query, avoiding N+1 queries by pre-populating previous/next navigation caches (#376)
Add automatic composite indexes on version tables for optimized version lookups: (pk_columns, transaction_id DESC) index and (pk_columns, transaction_id, end_transaction_id) for validity strategy temporal queries (#376)
Add create_composite_index configuration option to control composite index creation (#376)
Added python 3.14 support by @josecsotomorales in #374
Fix utc_now() to return a naive datetime (#373, thanks to dawhalen)
Fix utc_now() to return a naive datetime (#373, thanks to dawhalen)
Remove SQLAlchemy-Utils dependency by porting required functions to internal _compat module (#352) Note: if you use SQLAlchemy-Utils directly, you may need to add it as a dependency. - Port core functions: ImproperlyConfigured, get_declarative_base, naturally_equivalent - Port column utilities: get_columns, get_primary_keys, identity, get_column_key - Port advanced functionality: has_changes, JSONType, generic_relationship with full SQLAlchemy 2.x compatibility - Maintain full backward compatibility while eliminating external dependency - Reduce installation footprint and potential version conflicts
Fix SQLAlchemy 2.0 deprecation warnings: replace Query.get() with Session.get() for improved compatibility
ruff <https://docs.astral.sh/ruff/>_ for code linting and formatting, replacing flake8 with a faster Rust-based tool. (#364)pyupgrade <https://github.com/asottile/pyupgrade>_ integration to automatically modernize Python 3.9+ syntaxRemove SQLAlchemy pin and require latest SQLAlchemy-Utils
Remove SQLAlchemy pin and require latest SQLAlchemy-Utils
Remove use of deprecated _app_ctx_stack and _request_ctx_stack (#307, thanks to rubencho)
Pin SQLAlchemy due to SQLAlchemy-Utils breakage
Fix docs (#335, thanks to gnu-lorien)
Remove use of deprecated _app_ctx_stack and _request_ctx_stack (#307, thanks to rubencho)
Update Python version in setup.py
Update Python version in setup.py
Add support for SQLAlchemy 2.0
Remove compatibility code for SQLAlchemy < 1.4 and Python 2
Fix deadlock issues in MySQL on concurrent inserts (#172, thanks to mfulgo)
Allow overriding of DATABASE_URL for docker compose
Switch to before_execute for association tracking
Use ORM instead of deadlock-prone validity update query
create_trigger and sync_trigger now take a session, not a connection
Removed Operation.iteritems
Fix docs (#329, thanks to kelvinscuesta)
Fix docs (#329, thanks to kelvinscuesta)
Declare six as a dependency (#327, thanks to zupo)
This was a misreading of the contract, and would result in errors using alternative IDs as described in the Flask-Login docs ( #316 ).
This was a misreading of the contract, and would result in errors
using alternative IDs as described in the Flask-Login docs (#316).
Undo unneeded change to Flask-Login that breaks alternative IDs (#325, thanks to anthraxx)
Fix some deprecation warnings in SA 1.4 (#269, #277, #279, #300, #302, thanks to TomGoBravo, edhaz, and indiVar0508)
Fixes for Flask 2.2 and Flask-Login 0.6.2 (#288, thanks to AbdealiJK)
Allow changed_entities to work without TransactionChanges plugin (#268, thanks to TomGoBravo)
Fix Activity plugin for non-composite primary keys not named id (#210, thanks to dryobates)
Allow sync_trigger to pass arguments through to create_trigger (#273, thanks to nanvel)
Fix association tables on Oracle (#291, thanks to AbdealiJK)
Fix some deprecation warnings in SA 1.4 (#269, #277, #279, #300, #302, thanks to TomGoBravo, edhaz, and indiVar0508)
- Support SA 1.4
Support SA 1.4
Made ModelBuilder create column aliases in version models (#246, courtesy of killthekitten)
Made ModelBuilder create column aliases in version models (#246, courtesy of killthekitten)
Added explicit "pseudo-backref" relationships for version/parent (#240, courtesy of lgedgar)
Added explicit "pseudo-backref" relationships for version/parent (#240, courtesy of lgedgar)
Fixed m2m Bug when an unrelated change is made to a model (#242, courtesy of Andrew-Dickinson)
Reverted trigger creation from 1.3.7
Added SA 1.3 support
Reverted trigger creation from 1.3.7
Fix trigger creation during alembic migrations (#209, courtesy of lyndsysimon)
Fix trigger creation during alembic migrations (#209, courtesy of lyndsysimon)
Fixed ResourceClosedErrors from connections leaking when using an external transaction (#196, courtesy of vault)
Fixed ResourceClosedErrors from connections leaking when using an external transaction (#196, courtesy of vault)
Track cloned connections (#167, courtesy of netcriptus)
Track cloned connections (#167, courtesy of netcriptus)
Exclude many-to-many properties from versioning if they are added in exclude parameter (#169, courtesy of fuhrysteve)
Exclude many-to-many properties from versioning if they are added in exclude parameter (#169, courtesy of fuhrysteve)
Fixed changeset when updating object in same transaction as inserting it (#141, courtesy of oinopion)
Fixed changeset when updating object in same transaction as inserting it (#141, courtesy of oinopion)
Fixed multiple schema handling (#132, courtesy of vault)
Fixed multiple schema handling (#132, courtesy of vault)
Fixed subclass retrieval for closest_matching_table (#163, courtesy of debonzi)
Fixed subclass retrieval for closest_matching_table (#163, courtesy of debonzi)
Fixed memory leaks with UnitOfWork instances (#131, courtesy of quantus)
Dropped py2.6 support
Fixed memory leaks with UnitOfWork instances (#131, courtesy of quantus)
Added explicit sequence names for Oracle (#118, courtesy of apfeiffer1)
Added explicit sequence names for Oracle (#118, courtesy of apfeiffer1)
Fixed some relationship changes not counted as modifications (#116, courtesy of tvuotila)
Fixed some relationship changes not counted as modifications (#116, courtesy of tvuotila)
Fixed deep joined table inheritance handling (#105, courtesy of piotr-dobrogost)
Fixed deep joined table inheritance handling (#105, courtesy of piotr-dobrogost)
Fixed naive assumption of related User model always having id column (#107, courtesy of avilaton)
Fixed one-to-many relationship reverting (#102, courtesy of sdorazio)
Removed generated changes attribute from version classes. This attribute can be accessed through transaction.changes
Removed generated changes attribute from version classes. This attribute can be accessed through transaction.changes
Removed is_modified checking from insert operations
Added smart primary key type inspection for user class (#86, courtesy of mattupstate)
Added smart primary key type inspection for user class (#86, courtesy of mattupstate)
Added support for self-referential version relationship reflection (#88, courtesy of dtheodor)
Fixed One-To-Many version relationship handling (#82, courtesy of dtheodor)
Fixed One-To-Many version relationship handling (#82, courtesy of dtheodor)
Fixed Many-To-Many version relationship handling (#83, courtesy of dtheodor)
Fixed inclusion and exclusion of aliased columns
Removed automatic exclusion of auto-assigned datetime columns and tsvector columns (explicit is better than implicit)
Made FlaskPlugin accepts overriding of current_user_id_factory and remote_addr_factory
Made FlaskPlugin accepts overriding of current_user_id_factory and remote_addr_factory
Fixed identifier quoting in trigger syncing
Fixed identifier quoting in trigger syncing
Fixed native versioning trigger syncing
Fixed native versioning trigger syncing
Added optional native trigger based versioning for PostgreSQL dialect
Added Python 3.4 to test suite
Added optional native trigger based versioning for PostgreSQL dialect
Added create_models option
Added count_versions utility function
Fixed custom transaction column name handling with models using joined table inheritance
Fixed subquery strategy support for models using joined table inheritance
Fixed savepoint handling
Fixed version model building when no versioned models were found (previously threw AttributeError)
Replaced plugin template methods before_create_tx_object and after_create_tx_object with transaction_args to better cope with native versioning
Added __repr__ for Operations class
Added __repr__ for Operations class
Fixed an issue where assigning unmodified object's attributes in user defined before flush listener would raise TypeError in UnitOfWork
Allowed easier overriding of PropertyModTracker column creation
Allowed easier overriding of PropertyModTracker column creation
Rewrote join table inheritance handling schematics (now working with SA 0.9.6)
SQLAlchemy-Utils dependency updated to 0.26.5
Fixed an issue where deleting an object with deferred columns would throw ObjectDeletedError.
Fixed an issue where deleting an object with deferred columns would throw ObjectDeletedError.
Made viewonly relationships with association tables not register the association table to versioning manager registry.
Added __repr__ for Transaction class, issue #59
Added __repr__ for Transaction class, issue #59
Made transaction_cls of VersioningManager configurable.
Removed generic relationships from transaction class to versioned classes.
Removed generic relationships from transaction changes class to versioned classes.
Removed relation_naming_function (no longer needed)
Moved get_bind to SQLAlchemy-Utils
Removed inflection package from dependencies (no longer needed)
SQLAlchemy-Utils dependency updated to 0.26.2
Added order_by mapper arg ignoring for version class reflection if other than string argument is used
Added order_by mapper arg ignoring for version class reflection if other than string argument is used
Added support for customizing the User class which the Transaction class should have relationship to (issue #53)
Changed get_versioning_manager to throw ClassNotVersioned exception if first argument is not a versioned class
Fixed relationship reflection from versioned classes to non versioned classes (issue #52)
SQLAlchemy-Utils dependency updated to 0.25.4
Fixed many-to-many unit of work inspection when using engine bind instead of collection bind
Fixed many-to-many unit of work inspection when using engine bind instead of collection bind
Fixed various issues if primary key aliases were used in declarative models
Fixed an issue where association versioning would not work with custom transaction column name
SQLAlchemy-Utils dependency updated to 0.25.3
Added support for concrete inheritance
Added support for concrete inheritance
Added order_by mapper arg reflection to version classes
Added support for column_prefix mapper arg
Made model builder copy inheritance mapper args to version classes from parent classes
Fixed end transaction id setting for join table inheritance classes. Now end transaction id is set explicitly to all tables in inheritance hierarchy.
Fixed single table inheritance handling
Added some schema tools to help migrating between different plugins and versioning strategies
Added some schema tools to help migrating between different plugins and versioning strategies
Added remove_versioning utility function, see issue #45
Added order_by transaction_id default to versions relationship
Fixed PropertyModTrackerPlugin association table handling.
Fixed get_bind schematics (Flask-SQLAlchemy integration wasn't working)
Fixed a bug where committing a session without objects would result in KeyError
SQLAlchemy dependency updated to 0.9.4
Naming conventions change: History -> Version (to be consistent throughout Continuum)
Added new plugin architecture
Added ActivityPlugin
Naming conventions change: History -> Version (to be consistent throughout Continuum)
Naming convention change: TransactionLog -> Transaction
Rewritten reflected relationship model for version classes. Only dynamic relationships are now reflected as dynamic relationships. Other relationships return either lists or scalars.
One-To-One relationship support for reflected version class relationships
Removed tx_context context manager. Transaction objects can now be created manually and user has direct access to the parameters of this object.
Removed tx_meta context manager. Transaction meta objects can now be created explicitly.
Fixed association reverting when the relationship uses uselist=False
Fixed one-to-many directed relationship reverting when the relationship uses uselist=False
Fixed many-to-many relationship handling when multiple links were created during the same transaction
Added indexes to operation_type, transaction_id and end_transaction_id columns of version classes
Deprecated extensions
SQLAlchemy-Utils dependency updated to 0.25.0
Fixed version next / previous handling
Fixed version next / previous handling
SQLAlchemy dependency updated to 0.9.3
Fixed column onupdate to history table reflection (issue #47)
Fixed MySQL support (issue #36)
Fixed MySQL support (issue #36)
Added SQLite and MySQL to testing matrix
- Added vacuum function
Added vacuum function
Ability to track property modifications
Ability to track property modifications
New configuration options: track_property_modifications and modified_flag_suffix
Only autoincremented columns marked as autoincrement=False for history tables. This enables alembic migrations to generate without annoying explicit a
Only autoincremented columns marked as autoincrement=False for history tables. This enables alembic migrations to generate without annoying explicit autoincrement=False args.
Custom database schema support added
Custom database schema support added
TSVectorType columns not versioned by default (in order to avoid massive version histories)
TSVectorType columns not versioned by default (in order to avoid massive version histories)
Full MySQL and SQLite support added
Full MySQL and SQLite support added
Fixed UnitOfWork changed entities handling (now checks only for versioned attributes not all object attributes)
Fixed UnitOfWork changed entities handling (now checks only for versioned attributes not all object attributes)
Fixed UnitOfWork TransactionMeta object creation (now checks if actual modifications were made)
Added support for SQLAlchemy-i18n
Added support for SQLAlchemy-i18n
Added database independent transaction meta parameter handling (formerly supported postgres only)
Added database independent transaction meta parameter handling (formerly supported postgres only)
Smarter is_modified handling for UnitOfWork (now understands excluded properties)
Smarter is_modified handling for UnitOfWork (now understands excluded properties)
Fixed FlaskVersioningManager schematics when working outside of request context (again)
Fixed FlaskVersioningManager schematics when working outside of request context (again)
Added possibility to use custom UnitOfWork class
Fixed FlaskVersioningManager schematics when working outside of request context
Fixed FlaskVersioningManager schematics when working outside of request context
Fixed is_auto_assigned_date_column (again)
Fixed is_auto_assigned_date_column (again)
Moved some core utility functions to SQLAlchemy-Utils
Fixed is_auto_assigned_date_column
Fixed is_auto_assigned_date_column
Inflection added to requirements
DateTime columns with defaults excluded by default from history classes
DateTime columns with defaults excluded by default from history classes
Column inclusion added as option
Your coding agent can read these notes before it upgrades. Set up the MCP server →