An open API service indexing awesome lists of open source software.

https://github.com/easypost/rmmm

Rust MySQL Migration Manager
https://github.com/easypost/rmmm

Last synced: 6 months ago
JSON representation

Rust MySQL Migration Manager

Awesome Lists containing this project

README

          

This is a small Rust application for managing database migrations for MySQL.

[![CI](https://github.com/EasyPost/rmmm/workflows/CI/badge.svg?branch=master)](https://github.com/EasyPost/rmmm/actions/workflows/ci.yml)
[![Crates.io](https://img.shields.io/crates/v/rmmm)](https://crates.io/crates/rmmm)
[![Crates.io](https://img.shields.io/crates/l/rmmm)](LICENSE.txt)

It compiles into a single binary called `rmmm`.

Configuration, by default, is through the `db/` directory of the directory in which `rmmm` is invoked. Migrations will
live in `db/migrations/v{version}.sql`, rollbacks in `db/migrations/v{version}_downgrade.sql`,
and structure will be dumped to `db/structure.sql`.

Basic usage:

1. `cargo install rmmm`
1. `rmmm generate foo` will pop up an editor for you to write a migration. Migrations may be any number of SQL statements on lines by themselves ending with the `;` character. Comments are stripped.
1. `rmmm status` will show all pending migrations
1. `rmmm upgrade latest` will apply pending migrations. You can also upgrade (or downgrade) to a specific version.

Modifying actions will only print out what they would do by default and must be run with `--execute` to make changes.

Schema versions are just incrementing integers for simplicity.

Configuration is typically through environment variables:

| Environment Variable | Meaning |
|----------------------|---------|
| `$DATABASE_URL` | URL (`mysql://`) to connect to MySQL |
| `$DATABASE_DSN` | DSN (as per [go-sql-driver](https://github.com/go-sql-driver/mysql/#user-content-dsn-data-source-name)) to connect to MySQL |
| `$MIGRATION_PATH` | Path to store state (defaults to `./db`) |

Either `$DATABASE_URL` or `$DATABASE_DSN` must be passed. They can also be passed to the program as `--database-dsn` or `--database-url`.

This work is licensed under the ISC license, a copy of which can be found in [LICENSE.txt](LICENSE.txt).

Features
--------
RMMM supports the following feature flags:

| Name | Meaning | Enabled by default |
|------|---------|--------------------|
| `uuid` | Add support for native MySQL UUID types | ✓ |
| `native-tls` | Use [native-tls](https://crates.io/crates/native-tls) to get SSL support via the local library (OpenSSL, etc) | |
| `rustls-tls` | Use [rustls](https://crates.io/crates/rustls) to get SSL support | |

You can enable exactly zero or one of `native-tls` or `rustls-tls`.

Why?
----
There are lots of migration management tools. A popular stand-alone choice is
[dogfish](https://github.com/dwb/dogfish); there are also tools using richer libraries for various
ecosystems such as [barrel](https://git.irde.st/spacekookie/barrel) for diesel, or Python's
[alembic](https://alembic.sqlalchemy.org/en/latest/).

This tool is closest to dogfish, but avoids the various shell injection risks and uses the same `DATABASE_URL`
configuration string as other common frameworks (Rust's `mysql`, Python's `sqlalchemy`, Ruby's `activerecord`, etc).