A live migration system for Alembic.
Project description
Live Alembic
Apply database migrations without migration files. Live Alembic uses Alembic's
autogeneration to diff your SQLAlchemy models against the live database and
applies DDL directly — no versions/ directory, no commit-to-run cycle.
Install
pip install live-alembic
Quickstart
1. Create migrate_env.py in your project root:
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import declarative_base
# SQLite
db_url = "sqlite:///myapp.db"
# PostgreSQL
# db_url = "postgresql+psycopg2://user:password@localhost/mydb"
# MySQL / MariaDB
# db_url = "mysql+pymysql://user:password@localhost/mydb"
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String(100))
email = Column(String(255))
target_metadata = Base.metadata
# Optional: List of tables to ignore (e.g. tables managed by other applications)
# ignore_tables = ["some_external_table"]
2. Check for pending changes:
livealembic check
Exits 0 if the schema is in sync, 1 if changes are pending.
3. Apply changes:
livealembic migrate
CLI Reference
livealembic check [--file PATH] [--format text|json] [--verbose]
livealembic migrate [--file PATH] [--format text|json] [--verbose]
livealembic --version
| Command | Description | Exit code |
|---|---|---|
check |
Show pending changes, do not apply | 1 if changes exist |
migrate |
Apply pending changes | 1 on error |
| Option | Default | Description |
|---|---|---|
--file PATH |
migrate_env.py |
Path to your configuration module |
--format json |
text |
Machine-readable JSON output |
--verbose |
off | Include raw operation details in output |
Example output
Create table "orders"
Add column 'phone' (VARCHAR(20)) to table 'users'
Drop column 'legacy_id' from table 'users'
Alter column 'status' on 'orders' to type INTEGER
CI / CD usage
# Fail the pipeline if the schema has drifted
livealembic check --file config/migrate_env.py
# Apply during deployment
livealembic migrate --file config/migrate_env.py
Package Entry Points
Other libraries can automatically include SQLAlchemy models into the application's migration metadata by registering an entry point under the live_alembic.models group. Live Alembic dynamically loads all registered entry points under this group and merges their tables into the application's target_metadata.
The entry point can point to:
- A SQLAlchemy
MetaDatainstance. - A SQLAlchemy Declarative Base (or registry) subclass with a
metadataattribute. - A SQLAlchemy
Tableobject. - A module—in which case Live Alembic will inspect its attributes to discover any
MetaData, Declarative Base, orTableinstances.
Example registration in a library's pyproject.toml:
[project.entry-points."live_alembic.models"]
my_library_models = "my_library.models:metadata"
Hooks
Define before_migrate and/or after_migrate in migrate_env.py to run data
migrations in the same transaction as the schema change:
from live_alembic import Changes
from sqlalchemy import text
def before_migrate(changes: Changes, connection):
if changes.added_column("users", "full_name"):
connection.execute(
text("UPDATE users SET full_name = first_name || ' ' || last_name")
)
def after_migrate(changes: Changes, connection):
if changes.dropped_column("users", "legacy_token"):
connection.execute(text("DELETE FROM audit_log WHERE action = 'token_refresh'"))
Both hooks receive a Changes helper and the active connection. If a hook
raises, the transaction is rolled back (schema + data).
See documentation/usage/usage.org for the full hooks API, database-specific notes, and programmatic API docs.
Testing
Complete development tests require docker compose for database integration.
Local Tests
Run the standard test suite against SQLite (no Docker required):
make test
Database Integration Tests
Start database services and run tests against a specific backend:
make test-postgresql
make test-mysql
Or run against all supported databases sequentially:
make test-all
Test Matrix (Tox)
Run the full matrix of supported Python versions and databases:
make tox
Coverage
Generate a coverage report for the SQLite tests:
make coverage
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file live_alembic-0.3.3.tar.gz.
File metadata
- Download URL: live_alembic-0.3.3.tar.gz
- Upload date:
- Size: 16.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
27c17d053635c954999a1ea734c6b0c3eaf053ccacefadecd6234865e944be79
|
|
| MD5 |
e95d66e8d4f4567505611394284ada15
|
|
| BLAKE2b-256 |
1689046a37dda2079137e3c971f8df57ec81fa2eca006eb7f8c418781e60748e
|
File details
Details for the file live_alembic-0.3.3-py3-none-any.whl.
File metadata
- Download URL: live_alembic-0.3.3-py3-none-any.whl
- Upload date:
- Size: 15.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f957fa84050a9379a9da25fb6ef1d8e7adc0cbe4b51e33ce774d55ebd4f5ef6
|
|
| MD5 |
e5ad1a3d97f8694e29b7ec9acc730aed
|
|
| BLAKE2b-256 |
033ce3a266afd4f57bbe2b2110289c074c2b0260dcb46d88e2116351ffcb694b
|