Skip to main content

Retort is a schema migration tool for SQLAlchemy.

Project description

Retort is a schema migration tool for SQLAlchemy, compares DB schema against table metadata, and updates DB schema according to this.

It depends on the Alembic autogenerate.

Requirements

Retort works with

  • Python 3.3+

  • SQLAlchemy

  • Alembic

  • autopep8

Installation

via pip

$ pip install retort

via setup.py

$ python setup.py install

Basic Usage Examples

Generate config file (retort_config.py)

(venv) tpdn@example:~/retort_example$ retort init
Create retort_conf.py.

Edit config file

# retort_config.py
from model import user

TARGETS = [
    {
        'engine': user.engine, #sqlalchemy engine
        'metadata': user.Base.metadata #sqlalchemy metadata
    },
]
# model/user.py
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base


engine = create_engine('mysql+pymysql://foobar:abcdef@localhost/retort_test_db')
Base = declarative_base()


class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(255))
    fullname = Column(String(255))
    xyz = Column(String(255))

Apply

(venv) tpdn@example:~/retort_example$ retort apply
====================
url: mysql+pymysql://foobar:abcdef@localhost/retort_test_db
logging_name: None
====================
op.create_table('users',
                sa.Column('id', sa.Integer(), nullable=False),
                sa.Column('name', sa.String(length=255), nullable=True),
                sa.Column('fullname', sa.String(length=255), nullable=True),
                sa.Column('xyz', sa.String(length=255), nullable=True),
                sa.PrimaryKeyConstraint('id')
                )

Do you really want to apply this? [y/n]: y

Applying migration......
====================
url: mysql+pymysql://foobar:abcdef@localhost/retort_test_db
logging_name: None
====================
op.create_table('users',
                sa.Column('id', sa.Integer(), nullable=False),
                sa.Column('name', sa.String(length=255), nullable=True),
                sa.Column('fullname', sa.String(length=255), nullable=True),
                sa.Column('xyz', sa.String(length=255), nullable=True),
                sa.PrimaryKeyConstraint('id')
                )

---> Processing time: 0.0894(sec)
Complete!

Update model(remove xyz column)

# model/user.py
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base


engine = create_engine('mysql+pymysql://foobar:abcdef@localhost/retort_test_db')
Base = declarative_base()


class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(255))
    fullname = Column(String(255))
    # xyz = Column(String(255))

Apply with –sql option

(venv) tpdn@example:~/retort_example$ retort apply --sql
====================
url: mysql+pymysql://foobar:abcdef@localhost/retort_test_db
logging_name: None
====================
ALTER TABLE users DROP COLUMN xyz;

Do you really want to apply this? [y/n]: y

Applying migration......
====================
url: mysql+pymysql://foobar:abcdef@localhost/retort_test_db
logging_name: None
====================
ALTER TABLE users DROP COLUMN xyz;

---> Processing time: 0.0745(sec)
Complete!

Commands and Options

retort init

retort apply
  --sql # print sql mode
  --dry-run # dry run (no database update)
  --yes # skip confirmation
  --without-drop # without drop operations (DROP TABLE, DROP COLUMN, DROP INDEX, DROP CONSTRAINT)

retort print_operations
  --sql
  --without-drop

Author

NAKAMORI Ryosuke - https://github.com/tpdn

Licence

BSD License (2-Clause)

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

retort-0.1.0.tar.gz (8.1 kB view hashes)

Uploaded Source

Built Distributions

retort-0.1.0-py3.5.egg (12.3 kB view hashes)

Uploaded Source

retort-0.1.0-py3-none-any.whl (8.6 kB view hashes)

Uploaded Python 3

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