Python package to migrate postgresql database
Project description
generate
Example usage:
dbmigrator generate add_id_to_users
generates a file called migrations/20151217170514_add_id_to_users.py with content:
def up(cursor): # TODO migration code pass def down(cursor): # TODO rollback code pass
To set the migrations directory using an entry point, in mymodule setup.py:
setup( ... entry_points={ 'dbmigrator': [ 'migrations_directory = mymodule.main:migrations_directory', ], }, )
Important note: For the settings from setup.py to be picked up, before running dbmigrator, first run python setup.py develop or python setup.py install.
Then in mymodule/main.py:
import os migrations_directory = '{}/sql/migrations'.format( os.path.abspath(os.path.dirname(__file__)))
or:
import os def migrations_directory(): return '{}/sql/migrations'.format( os.path.abspath(os.path.dirname(__file__)))
init
Example usage:
dbmigrator --db-connection-string='postgres://dbuser@localhost/dbname' init
or with a config file, development.ini, that looks like this:
[app:main] db-connection-string = postgres://dbuser@localhost/dbname
Run the command:
dbmigrator --config=development.ini init
list
Example usage:
$ dbmigrator list name | is applied | date applied ---------------------------------------------------------------------- 20151217170514_add_id_to_ True 2016-01-31 00:15:01.692570+01:00 20151218145832_add_karen_ False 20160107200351_blah False
migrate
Example usage:
With two migrations in the migrations directory,
migrations/20151217170514_add_id_to_users.py:
def up(cursor): # TODO migration code pass def down(cursor): # TODO rollback code pass
and
migrations/20151218145832_add_karen_to_users.py:
def up(cursor): cursor.execute('ALTER TABLE users ADD COLUMN karen TEXT') def down(cursor): cursor.execute('ALTER TABLE users DROP COLUMN karen')
To run the migrations:
$ dbmigrator migrate Running migration 20151217170514 add_id_to_users Running migration 20151218145832 add_karen_to_users --- +++ @@ -4005,21 +4005,22 @@ first_name text, firstname text, last_name text, surname text, full_name text, fullname text, suffix text, title text, email text, website text, - is_moderated boolean + is_moderated boolean, + karen text ); ALTER TABLE public.users OWNER TO rhaptos; -- -- Name: abstractid; Type: DEFAULT; Schema: public; Owner: rhaptos -- ALTER TABLE ONLY abstracts ALTER COLUMN abstractid SET DEFAULT nextval('abstracts_abstractid_seq'::regclass);
or to run migrations up to a specific version:
$ dbmigrator migrate version=20151217170514 Running migration 20151217170514 add_id_to_users
if all migrations have already been run:
$ dbmigrator migrate No pending migrations. Database is up to date.
rollback
Example usage:
With two migrations in the migrations directory,
migrations/20151217170514_add_id_to_users.py:
def up(cursor): # TODO migration code pass def down(cursor): # TODO rollback code pass
and
migrations/20151218145832_add_karen_to_users.py:
def up(cursor): cursor.execute('ALTER TABLE users ADD COLUMN karen TEXT') def down(cursor): cursor.execute('ALTER TABLE users DROP COLUMN karen')
Make sure the database is up to date:
$ dbmigrator migrate No pending migrations. Database is up to date.
Now rollback the last migration:
$ dbmigrator rollback Rolling back migration 20151218145832 add_karen_to_users --- +++ @@ -4005,22 +4005,21 @@ first_name text, firstname text, last_name text, surname text, full_name text, fullname text, suffix text, title text, email text, website text, - is_moderated boolean, - karen text + is_moderated boolean ); ALTER TABLE public.users OWNER TO rhaptos; -- -- Name: abstractid; Type: DEFAULT; Schema: public; Owner: rhaptos -- ALTER TABLE ONLY abstracts ALTER COLUMN abstractid SET DEFAULT nextval('abstracts_abstractid_seq'::regclass);
To rollback the last 2 migrations:
$ dbmigrator rollback --steps=2 Rolling back migration 20151218145832 add_karen_to_users --- +++ @@ -4005,22 +4005,21 @@ first_name text, firstname text, last_name text, surname text, full_name text, fullname text, suffix text, title text, email text, website text, - is_moderated boolean, - karen text + is_moderated boolean ); ALTER TABLE public.users OWNER TO rhaptos; -- -- Name: abstractid; Type: DEFAULT; Schema: public; Owner: rhaptos -- ALTER TABLE ONLY abstracts ALTER COLUMN abstractid SET DEFAULT nextval('abstracts_abstractid_seq'::regclass); Rolling back migration 20151217170514 add_id_to_users
CHANGELOG
0.0.5 (2016-02-08)
Include CHANGELOG in distribution’s manifest
0.0.4 (2016-02-08)
Show warning message instead of error if migrations directory is undefined
Add CHANGELOG
0.0.3 (2016-02-08)
Return error if migrations directory is undefined
0.0.2 (2016-02-03)
Fix invalid rst in README
Update setup.py description and long_description
Update setup.py to include README as the description and fix url
Update README and cli after removing default value for config file
Remove default config path (development.ini)
Add dbmigrator list command
Fix dbmigrator rollback to stop if there are no migrations to rollback
Print message after initializing schema migrations
Add note to run python setup.py install if using entry points
Add migrations directory setting from setup.py entry point in README
Update command names for init and generate in README
Get settings from setup.py entry points
Remove __init__.py generation in migrations directory
Add option version to dbmigrator init for setting the initial version
Rename “generate_migration” command to “generate”
Rename “init_schema_migrations” command to “init”
Change the way migrations are imported so it works in python2
Add “applied” timestamp to schema migrations table
Add # -*- coding: utf-8 -*- to the top of generated migration files
Add README
Add command “rollback” to rollback migrations
Add command “migrate” to run pending migrations
Add migrations to table when running init_schema_migrations
Add command for creating the schema migrations table
Create dbmigrator cli and “generate_migration” command
Create dbmigrator python package
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.