This is a small Rust application for managing database migrations for MySQL.
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:
cargo install rmmm
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.rmmm status
will show all pending migrationsrmmm 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) 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.
RMMM supports the following feature flags:
Name | Meaning | Enabled by default |
---|---|---|
uuid |
Add support for native MySQL UUID types | ✓ |
native-tls |
Use native-tls to get SSL support via the local library (OpenSSL, etc) | |
rustls-tls |
Use rustls to get SSL support |
You can enable exactly zero or one of native-tls
or rustls-tls
.
There are lots of migration management tools. A popular stand-alone choice is dogfish; there are also tools using richer libraries for various ecosystems such as barrel for diesel, or Python's alembic.
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).