Crates.io | dbmigrate |
lib.rs | dbmigrate |
version | 0.4.0 |
source | src |
created_at | 2015-12-19 14:29:13.444552 |
updated_at | 2023-01-22 16:59:37.659198 |
description | CLI tool to create and run database migrations. Postgres, MySQL supported. |
homepage | https://github.com/Keats/dbmigrate |
repository | https://github.com/Keats/dbmigrate |
max_upload_size | |
id | 3704 |
size | 62,472 |
A tool to create and manage SQL migrations.
Every call to dbmigrate requires 2 arguments: database url and migrations folder.
Those can be set through environment variables: DBMIGRATE_URL
and DBMIGRATE_PATH
, using a .env file, or as args to a call. Argument will override an environment variable.
# create a migration file
dbmigrate --url postgres://.. --path ./migrations create my_name
# apply all non applied migrations
dbmigrate --url postgres://.. --path ./migrations up
# un-apply all migrations
dbmigrate --url postgres://.. --path ./migrations down
# redo the last migration
dbmigrate --url postgres://.. --path ./migrations redo
# revert the last migration
dbmigrate --url postgres://.. --path ./migrations revert
# see list of migrations and which one is currently applied
dbmigrate --url postgres://.. --path ./migrations status
The format of the migration files is the following:
0001.initial_db.up.sql
0001.initial_db.down.sql
You can also pass a string to create
and dbmigrate will slugify it for you:
dbmigrate --url postgres://.. --path ./migrations create "change currency table"
# gives the following files
0001.change_currency_table.up.sql
0001.change_currency_table.down.sql
.
(dot) is not allowed in a migration name as it is the filename separator character.
Migrations can also be done programmatically and is how the CLI tool is built.
You will need to add the dbmigrate-lib
dependency to your Cargo.toml
file. The best example to see how how to make it work
is to look at the dbmigrate
directory, which uses it to implement the CLI tool.
Build the project first with cargo build
.
Assuming you use the docker images in the Makefile for pg and mysql:
Postgres:
./target/release/dbmigrate --url=postgres://pg@localhost:5777/migrate --path=/my/full/path/migrations status
MySQL:
./target/release/dbmigrate --url=mysql://mg:pass@localhost:5789/migrate --path=/my/full/path/migrations status
For Sqlite I have a Sqlite db named dbmigrate.db
in the repo (gitignored):
./target/release/dbmigrate --path=/home/vincent/Code/dbmigrate/examples/migrations --url=sqlite:///dbmigrate.db status
dbmigrate will use the default schema. You can override that from your database URL, for example for Postgres:
--url="postgres://postgres:@127.0.0.1:5432/migrate?application_name=my_app&options=-c search_path%3Dmy_app"
postgres-native-tls
This is heavily inspired by https://github.com/mattes/migrate.
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.