SQLAltery
A migration library for SQLAlchemy. A cleaner frontend to Alembic.
Guide
Set up management script
SQLAltery provides the "functional core".
To use it in your project, you'll need to provide your own "imperative shell", but this is easy.
Here's a starter managedb.py:
from pathlib import Path
import sqlalchemy as sa
from sqlaltery import CLI as SQLAlteryCLI
from my_app import my_model
class MyCLI(SQLAlteryCLI):
# where to store migration files
migration_dir = Path(__file__).parent / 'migration'
# your model metadata
metadata = my_model.Base.metadata
# URL of the DB you want to migrate
db_url = 'sqlite:///somedb.sqlite3'
if __name__ == '__main__':
import funcli
cli = MyCLI()
funcli.run({
# show pending changes to schema
'diff': cli.diff,
# create a new migration file from pending changes (if any)
# `commit [--data]`
'commit': cli.commit,
# migrate DB to a revision
# `sync [--revision <revision>] [--fake]`
'sync': cli.sync,
})
Terminology used here
You can name the operations anything, but this guide will use these terms:
commit: create a new migration (Django:py manage.py makemigrations)sync: apply migrations (Django:py manage.py migrate)sync --fake: fake migrations (Django:py manage.py migrate --fake); this updates only the migration metadata (tablesqlaltery_migration)
Reset migrations
Assuming your database(s) are synced to latest, delete your migration dir, create a new migration, and do a fake sync:
rm -rf migration
py managedb.py commit
py managedb.py sync --fake
Data migrations
Data migrations usually involve a three-step process: expand, project, contract.
- Expand the schema:
T_oldtoT_exp \superset T_new, whereT_expis such that the underlying database can automatically project the data onto it (e.g., adding only nullable columns) - Project the data: apply a function
T_exp -> T_newto the data; schema stays the same - Contract the schema:
T_exptoT_new
SQLAltery can automatically split the migration into these steps. Run:
py managedb.py commit --data
Now, modify the newly created migration to write data migration code in the forwards and backwards
methods in the generated file. You can access the current sa.MetaData in self.md.
Once you're done, sync:
py managedb.py sync
Why not use Alembic directly?
- Alembic diffs the head MD against current DB, not against latest migration
- Alembic has split upgrade/downgrade
- Alembic requires you to manually manage metadata in migrations (for doing queries)
- Alembic creates a bunch of files (alembic.ini, env.py). The default case should be simple: just create an
SQLAlteryand use it; customize by passing arguments.
Internal use
Set up:
uv sync --no-install-workspace
Run checks:
bash check.sh
How to publish:
bash build.sh
py -m twine upload artifact/dist/<file>
Metadata
Release files for sqlaltery 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sqlaltery-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Release files / sqlaltery-0.7.0-py3-none-any.whl
| Download URL | sqlaltery-0.7.0-py3-none-any.whl |
|---|---|
| Size | 17.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ea665af100a8112680c5c47cc4f104c40de2194be6dbd5a870c3525f85a5abed
|
|
BLAKE2b-256 checksum How to use checksums |
0de40baffcdf5dc0034361ac75ddf956c8147ff0d0714a2eda11b28346c71608
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.3
|