Skip to main content

Like diff but for PostgreSQL schemas

Project description

# migra: PostgreSQL migrations made almost painless

Schema migrations are without doubt the most cumbersome and annoying part of working with SQL databases. So much so that some people think that schemas themselves are bad!

But schemas are actually good. Enforcing data consistency and structure is a good thing. It’s the migration tooling that is bad, because it’s harder to use than it should be. migra is an attempt to change that, and make migrations easy, safe, and reliable instead of something to dread.

Migra supports PostgreSQL >= 9.4. Known issues exist with earlier versions.

## Full documentation

Official documentation is at [migra.djrobstep.com](https://migra.djrobstep.com).

## How it Works

Think of migra as a diff tool for schemas. Suppose database A and database B have similar but slightly different schemas. migra will detect the differences and output the SQL needed to transform A to B.

This includes changes to tables, views, functions, indexes, constraints, enums, sequences, and installed extensions.

You can use migra as a library to build your own migration scripts, tools, etc. Installing migra also installs the migra command, so you can use it as follows:

$ migra postgresql:///a postgresql:///b alter table “public”.”products” add column newcolumn text;

alter table “public”.”products” add constraint “x” CHECK ((price > (0)::numeric));

If b is the target schema, then a new column and constraint needs to be applied to a to make it match b’s schema. Once we’ve reviewed the autogenerated SQL and we’re happy with it, we can apply these changes as easily as:

$ migra –unsafe postgresql:///a postgresql:///b > migration_script.sql # Then after careful review (obviously)… $ psql a –single-transaction -f migration_script.sql

Migration complete!

## IMPORTANT: Practice safe migrations

Migrations can never be fully automatic. As noted above ALWAYS REVIEW MIGRATION SCRIPTS CAREFULLY, ESPECIALLY WHEN DROPPING TABLES IS INVOLVED.

Best practice is to run your migrations against a copy of your production database first. This helps verify correctness and spot any performance issues before they cause interruptions and downtime on your production database.

migra will deliberately throw an error if any generated statements feature the word “drop”. This safety feature is by no means idiot-proof, but might prevent a few obvious blunders.

If you want to generate “drop …” statements, you need to use the –unsafe flag if using the command, or if using the python package directly, set_safety( to false on your Migration object.

## Python Code

Here’s how the migra command is implemented under the hood (with a few irrelevant lines removed).

As you can see, it’s pretty simple (S here is a context manager that creates a database session from a database URL).

from migra import Migration from sqlbag import S

with S(args.dburl_from) as s0, S(args.dburl_target) as s1:

m = Migration(s0, s1)

if args.unsafe:

m.set_safety(False)

m.add_all_changes() print(m.sql)

Here the code just opens connections to both databases for the Migration object to analyse. m.add_all_changes() generates the SQL statements for the changes required, and adds to the migration object’s list of pending changes. The necessary SQL is now available as a property.

Features and Limitations

migra plays nicely with extensions. Schema contents belonging to extensions will be ignored and left to the extension to manage.

New: migra now plays nicely with view dependencies too, and will drop/create them in the correct order.

Only SQL/PLPGSQL functions are confirmed to work so far. migra ignores functions that use other languages.

Installation

Assuming you have pip installed, all you need to do is install as follows:

$ pip install migra

If you don’t have psycopg2 (the PostgreSQL driver) installed yet, you can install this at the same time with:

$ pip install migra[pg]

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

migra-1.0.1509328651.tar.gz (6.7 kB view details)

Uploaded Source

Built Distribution

migra-1.0.1509328651-py2.py3-none-any.whl (11.1 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file migra-1.0.1509328651.tar.gz.

File metadata

File hashes

Hashes for migra-1.0.1509328651.tar.gz
Algorithm Hash digest
SHA256 df2e1791a396a99f5d5384befb3d598a33793cc76b3cfbfe46337145aab860a2
MD5 77c2df9eee2cc9347c5fb9b5b8242c84
BLAKE2b-256 03cf7bde9f641032f8b709dc24a7792fcaf55787fb2c2beffa21458a8a9b3944

See more details on using hashes here.

File details

Details for the file migra-1.0.1509328651-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for migra-1.0.1509328651-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 74145a376aa974c10923e7dc0de326345a9258f2d8e9064886fd4c75b25e3961
MD5 38b4add52d1db037092e8b8dd3fa5962
BLAKE2b-256 9e57b4a8f6cd9a65ee7b1c5b0105be5623d2125693cc66a096637e418233d639

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