Skip to main content

No project description provided

Project description

migri

A simple Python async migration tool. You can use the CLI (run yourself or from a shell script) or import the exposed functions and run programatically. Currently supports Postgresql (asyncpg) and SQLite (aiosqlite). MySql (aiomysql) support coming soon!

migri is currently in alpha and although unlikely, the implementation may change

Motivation

Using async database libraries is useful when a service/application is already using an async library. It's extra overhead to install a synchronous library just to run migrations. Practically speaking, though, there isn't much benefit to running migrations asynchronously since migrations must be applied synchronously. Besides, the number of migrations for a service is generally small.

Getting started

Install migri

pip install migri[postgresql] pip install migri[sqlite]

Create migrations

Create a migrations directory and add your migrations. Migrations are applied in lexicographical order (e.g. 0001_initial.sql then 0002_add_user_data.py and so on).

Currently .sql and .py files are supported. If you write a Python migration file, ensure that it contains an async function migrate. An instance of asyncpg's Connection class will be passed into the function.

async def migrate(conn) -> bool:
    await conn.execute("INSERT INTO categories (name) VALUES ($1)", "Animals")
    return True

Migrate

Run migri migrate. Provide database credentials via arguments or environment variables:

  • --db-name or DB_NAME (required)
  • --db-user or DB_USER
  • --db-pass or DB_PASS
  • --db-host or DB_HOST
  • --db-port or DB_PORT

Other options:

  • -d, --dialect or DB_DIALECT (mysql, postgresql, sqlite, note that currently only postgresql is supported. If not set, migri will attempt to infer the dialect (and library to use) using the database port.)
  • -l, --log-level or LOG_LEVEL (default error)

When you run migrate, migri will create a table called applied_migration (if it doesn't exist). This is how migri tracks which migrations have already been applied.

Dry run mode

If you want to test your migrations without applying them, you can use the dry run flag: --dry-run.

Unfortunately, dry run mode does not work with SQLite at this moment. If you want to try to get it to work, see the issue.

Migrate programmatically

Migri can be called with a shell script (e.g. when a container is starting) or you can apply migrations from your application:

from migri import apply_migrations, PostgreSQLConnection

async def migrate():
    conn = PostgreSQLConnection(
        "sampledb",
        db_user="user",
        db_pass="passpass",
        db_host="localhost",
        db_port=5432
    )
    async with conn:
        await apply_migrations("migrations", conn)

Testing

  1. Set up local Python versions (e.g. pyenv local 3.7.7 3.8.3)
  2. Run docker-compose up to start Postgresql.
  3. Install nox with pip install nox.
  4. Run nox.

Docs

Docstrings are formatted in the Sphinx format.

Todos

  • Ensure that migrate command is safe to run even when no action need to be taken (e.g. helpful for container startup scripts)
  • Don't record empty migrations - warn user
  • Add dry run mode for testing migrations
  • Output migration results
  • Test modules not found
  • Test/handle incorrect migrate function signature (in migration Python files)
  • Add colorful output 🍭 for enhanced readability
  • Make error output more readable

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

migri-0.4.0.tar.gz (15.1 kB view details)

Uploaded Source

Built Distribution

migri-0.4.0-py3-none-any.whl (20.0 kB view details)

Uploaded Python 3

File details

Details for the file migri-0.4.0.tar.gz.

File metadata

  • Download URL: migri-0.4.0.tar.gz
  • Upload date:
  • Size: 15.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.7.7

File hashes

Hashes for migri-0.4.0.tar.gz
Algorithm Hash digest
SHA256 712dd544a38b0eda1102c9884279918d063902276e5df8068f8c564134dae23c
MD5 6734f136407bdff345a30168f4d39ae5
BLAKE2b-256 70d2ad444ddf509ac0965d2098df04c1b2dcca963a9c1048a572776b0be80184

See more details on using hashes here.

File details

Details for the file migri-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: migri-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 20.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.7.7

File hashes

Hashes for migri-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c420300575c3cce3839168a71d3b6fada48f89cd35cf86ca6b3af715be7cd5fe
MD5 25701308592673cb6fb8de5fd63e286d
BLAKE2b-256 cb98781b7ed83cdc13dc84d068efaf73d172b3307915cbf3c71244983839f02c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page