Like diff but for PostgreSQL schemas
Project description
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.
How it Works
Think of migra as a diff tool for schemas. Say database A and database B have a similar but slightly different schemas. migra will detect the differences and output the SQL needed to transform A to B.
Being a python library, you can use it programmatically and use it 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.
migra is in the alpha stage. Even more reason not trust it too much, and review and test your migrations thoroughly.
migra will deliberately throw an error if any generated statements feature the word “drop”. This safety feature is by no means bulletproof either, 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)
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.
Documentation
migra is in early alpha and documentation is scarce so far. We are working on remedying this. Watch this space.
Features and Limitations
Migra will detect changes to tables, views, materialized views, indexes, constraints, enums, sequences, and which extensions are installed.
In terms of specific PostgreSQL feature limitations, migra is only confirmed to work with SQL/PLPGSQL functions so far.
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
Built Distribution
File details
Details for the file migra-0.1.1470583937.tar.gz
.
File metadata
- Download URL: migra-0.1.1470583937.tar.gz
- Upload date:
- Size: 5.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b94b9498de260e05578f9bc5cdc4f26f1d31167194781fcc397942f19491df80 |
|
MD5 | e5d0ee9b78bd1678c4cecaec217bde75 |
|
BLAKE2b-256 | dcc660ba1d8a31c426deb70cfef4396f0494410594671061c2b4bf1ba0618f5c |
File details
Details for the file migra-0.1.1470583937-py2.py3-none-any.whl
.
File metadata
- Download URL: migra-0.1.1470583937-py2.py3-none-any.whl
- Upload date:
- Size: 9.7 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5b58d4dd2ee68fb9a6385a2b022e25d1cdafdedaa8d95bba3dc5b449879b9ebd |
|
MD5 | 9fe61e31f29374e62bb81ab7c71fb102 |
|
BLAKE2b-256 | c43b42b368a9eae9d708bfbb1ee3ba5b6d7f4ef886ff58b93cc99a3b7d1ea784 |