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 details)

Uploaded Source

Built Distributions

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

Uploaded Source

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

Uploaded Python 3

File details

Details for the file retort-0.1.0.tar.gz.

File metadata

  • Download URL: retort-0.1.0.tar.gz
  • Upload date:
  • Size: 8.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for retort-0.1.0.tar.gz
Algorithm Hash digest
SHA256 eba5262f8563b63e114d70ebb60ea4c452ac0c463d85614497080fc975353976
MD5 a5275ff50067b04df28868bcc7406d56
BLAKE2b-256 8e05b753bef4f254d2511468818397f749e2b4520c76c189633f7933f231c630

See more details on using hashes here.

File details

Details for the file retort-0.1.0-py3.5.egg.

File metadata

  • Download URL: retort-0.1.0-py3.5.egg
  • Upload date:
  • Size: 12.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for retort-0.1.0-py3.5.egg
Algorithm Hash digest
SHA256 19e4fb928d573c69067354c96f3a139b0c5f52da98907dd5bc5012d7c3aa0158
MD5 93cbde2eff4d6679df7d75fd19748518
BLAKE2b-256 225b3629f3126e221838f46be56e2f2b35c794252ec41ff617d619ff541620b0

See more details on using hashes here.

File details

Details for the file retort-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for retort-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d280ec33c8f7421ea0cb1870b92e3f369b16639fa0188ca0bca297cb883616b6
MD5 2cc22a362c61e95b0bf7f8eca2207a9b
BLAKE2b-256 22f332f8b819a6bc50a51ac999545165e45d794d876273137528b43e259a71ea

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