Skip to main content

Database schema migration tool, using SQL and DB-API

Project description

Yoyo-migrations is a database schema migration tool using plain SQL and the DB-API.

What does yoyo-migrations do?

As database applications evolve, changes to the database schema are often required. These can usually be written as one-off SQL scripts containing CREATE/ALTER table statements (although any SQL or python script may be used with yoyo-migrations).

Yoyo-migrations provides a command line tool for reading a directory of such scripts and applying them to your database as required.

Database support

PostgreSQL, MySQL and SQLite databases are supported.

Usage

Yoyo-migrations is usually invoked as a command line script.

Examples:

Read all migrations from directory migrations and apply them to a PostgreSQL database:

yoyo-migrate apply ./migrations/ postgres://user:password@localhost/database

Rollback migrations previously applied to a MySQL database:

yoyo-migrate rollback ./migrations/ mysql://user:password@localhost/database

Reapply (ie rollback then apply again) migrations to a SQLite database at location /home/sheila/important-data.db:

yoyo-migrate reapply ./migrations/ sqlite:////home/sheila/important-data.db

By default, yoyo-migrations starts in an interactive mode, prompting you for each migration file before applying it, making it easy to choose which migrations to apply and rollback.

The migrations directory should contain a series of migration scripts. Each migration script is a python file (.py) containing a series of steps. Each step should comprise a migration query and (optionally) a rollback query. For example:

#
# file: migrations/0001.create-foo.py
#
step(
        "CREATE TABLE foo (id INT, bar VARCHAR(20), PRIMARY KEY (id))",
        "DROP TABLE foo",
)

The filename of each file (without the .py extension) is used as the identifier for each migration. Migrations are applied in filename order, so it’s useful to name your files using a date (eg ‘20090115-xyz.py’) or with another incrementing number.

yoyo-migrate creates a table in your target database, _yoyo_migration, to track which migrations have been applied.

Steps may also take an optional argument ignore_errors, which must be one of apply, rollback, or all. If in the previous example the table foo might have already been created by another means, we could add ignore_errors='apply' to the step to allow the migrations to continue regardless:

#
# file: 0001.create-foo.py
#
step(
        "CREATE TABLE foo (id INT, bar VARCHAR(20), PRIMARY KEY (id))",
        "DROP TABLE foo",
        ignore_errors='apply',
)

Steps can also be python callable objects that take a database connection as their single argument. For example:

#
# file: 0002.update_keys.py
#
def do_step(conn):
        cursor = conn.cursor()
        cursor.execute(
                "INSERT INTO sysinfo "
                " (osname, hostname, release, version, arch)"
                " VALUES (%s, %s, %s, %s, %s %s)",
                os.uname()
        )
step(do_step)

Password security

You normally specify your database username and password as part of the database connection string on the command line. On a multi-user machine, other users could view your database password in the process list.

The -p or --prompt-password flag causes yoyo-migrate to prompt for a password, ignoring any password specified in the connection string. This password will not be available to other users via the system’s process list.

Connection string caching

The first time you run yoyo-migrate on a new set of migrations, you will be asked if you want to cache the database connection string in a file called .yoyo-migrate in the migrations directory.

This cache is local to the migrations directory, so subsequent runs on the same migration set do not need the database connection string to be specified.

This saves typing, avoids your database username and password showing in process listings and lessens the risk of accidentally running yoyo-migrate on the wrong database (ie by re-running an earlier yoyo-migrate entry in your command history when you have moved to a different directory).

If you do not want this cache file to be used, add the --no-cache parameter to the command line options.

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

yoyo-migrations-2.tar.gz (11.0 kB view details)

Uploaded Source

File details

Details for the file yoyo-migrations-2.tar.gz.

File metadata

  • Download URL: yoyo-migrations-2.tar.gz
  • Upload date:
  • Size: 11.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for yoyo-migrations-2.tar.gz
Algorithm Hash digest
SHA256 aa0156cd2f3828dee7625c1bb9d8d0673d5d47d0b52acd453c11d8f20bbf4eb4
MD5 0f304355fb4d0d6d397c84a38d22b9b9
BLAKE2b-256 a4959ff647032e3015136a847b37d813a88cb9c41c3ff33f21b9e8a3bc6d5ed6

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