2014-08-11 01:42:57 +00:00
|
|
|
# migrate
|
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
[![Build Status](https://travis-ci.org/mattes/migrate.svg?branch=v3.0-prev)](https://travis-ci.org/mattes/migrate)
|
2014-08-11 03:06:38 +00:00
|
|
|
[![GoDoc](https://godoc.org/github.com/mattes/migrate?status.svg)](https://godoc.org/github.com/mattes/migrate)
|
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
Database migrations written in Go. Use as CLI or import as library.
|
2014-08-13 21:58:30 +00:00
|
|
|
|
2014-08-11 01:42:57 +00:00
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
```
|
|
|
|
go get -u -tags 'postgres' -o migrate github.com/mattes/migrate/cli
|
2014-08-11 01:42:57 +00:00
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
import (
|
|
|
|
"github.com/mattes/migrate"
|
|
|
|
_ "github.com/mattes/migrate/database/postgres"
|
|
|
|
)
|
|
|
|
```
|
2014-08-11 01:42:57 +00:00
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
## Databases
|
2014-08-11 01:42:57 +00:00
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
Database drivers are responsible for applying migrations to databases.
|
|
|
|
Implementing a new database driver is easy. Just implement [database/driver interface](database/driver.go)
|
2014-08-11 01:42:57 +00:00
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
* [PostgreSQL](database/postgres)
|
|
|
|
* [Cassandra](database/cassandra)
|
|
|
|
* [SQLite](database/sqlite)
|
|
|
|
* [MySQL/ MariaDB](database/mysql)
|
|
|
|
* [Neo4j](database/neo4j)
|
|
|
|
* [Ql](database/ql)
|
|
|
|
* [MongoDB](database/mongodb)
|
|
|
|
* [CrateDB](database/crate)
|
|
|
|
* [Shell](database/shell)
|
2014-08-11 01:42:57 +00:00
|
|
|
|
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
## Migration Sources
|
2014-08-11 01:42:57 +00:00
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
Source Drivers read migrations from various locations. Implementing a new source driver
|
|
|
|
is easy. Just implement the [source/driver interface](source/driver.go).
|
2014-08-11 01:42:57 +00:00
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
* [Filesystem](source/file) - read from fileystem (always included)
|
|
|
|
* [Go-Bindata](source/go-bindata) - read from embedded binary data ([jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata))
|
|
|
|
* [Github](source/github) - read from remote Github repositories
|
|
|
|
* [AWS S3](source/aws-s3) - read from Amazon Web Services S3
|
|
|
|
* [Google Cloud Storage](source/google-cloud-storage) - read from Google Cloud Platform Storage
|
2014-08-11 01:42:57 +00:00
|
|
|
|
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
## CLI usage
|
2014-08-13 00:38:29 +00:00
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
```bash
|
|
|
|
# dowload, build and install the CLI tool
|
|
|
|
# -tags takes database and source drivers and will only build those
|
|
|
|
$ go get -u -tags 'postgres' -o migrate github.com/mattes/migrate/cli
|
|
|
|
|
|
|
|
$ migrate -help
|
|
|
|
Usage: migrate OPTIONS COMMAND [arg...]
|
|
|
|
migrate [ -version | -help ]
|
|
|
|
|
|
|
|
Options:
|
|
|
|
-source Location of the migrations (driver://url)
|
|
|
|
-path Shorthand for -source=file://path
|
|
|
|
-database Run migrations against this database (driver://url)
|
|
|
|
-prefetch N Number of migrations to load in advance before executing (default 10)
|
|
|
|
-verbose Print verbose logging
|
|
|
|
-version Print version
|
|
|
|
-help Print usage
|
|
|
|
|
|
|
|
Commands:
|
|
|
|
goto V Migrate to version V
|
|
|
|
up [N] Apply all or N up migrations
|
|
|
|
down [N] Apply all or N down migrations
|
|
|
|
drop Drop everyting inside database
|
|
|
|
version Print current migration version
|
|
|
|
|
|
|
|
|
|
|
|
# so let's say you want to run the first two migrations
|
|
|
|
migrate -database postgres://localhost:5432/database up 2
|
|
|
|
|
|
|
|
# if your migrations are hosted on github
|
|
|
|
migrate -source github://mattes:personal-access-token@mattes/migrate_test \
|
|
|
|
-database postgres://localhost:5432/database down 2
|
2014-08-11 01:42:57 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
## Use in your Go project
|
2014-08-11 01:42:57 +00:00
|
|
|
|
2014-08-13 00:38:29 +00:00
|
|
|
```go
|
2017-02-08 06:40:45 +00:00
|
|
|
import (
|
|
|
|
"github.com/mattes/migrate/migrate"
|
|
|
|
_ "github.com/mattes/migrate/database/postgres"
|
|
|
|
_ "github.com/mattes/migrate/source/github"
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
m, err := migrate.New("github://mattes:personal-access-token@mattes/migrate_test",
|
|
|
|
"postgres://localhost:5432/database?sslmode=enable")
|
|
|
|
m.Steps(2)
|
2014-08-13 00:38:29 +00:00
|
|
|
}
|
2014-08-11 01:42:57 +00:00
|
|
|
```
|
|
|
|
|
2014-08-13 02:04:58 +00:00
|
|
|
## Migration files
|
2014-08-13 00:38:29 +00:00
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
Each migration version has an up and down migration.
|
2014-08-11 01:42:57 +00:00
|
|
|
|
|
|
|
```
|
2017-02-08 06:40:45 +00:00
|
|
|
1481574547_create_users_table.up.sql
|
|
|
|
1481574547_create_users_table.down.sql
|
2014-08-11 01:42:57 +00:00
|
|
|
```
|
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
## Development and Testing
|
|
|
|
|
|
|
|
Tests require Docker (for database driver testing).
|
2014-08-11 01:42:57 +00:00
|
|
|
|
2017-02-08 06:40:45 +00:00
|
|
|
```
|
|
|
|
make test-short DATABASE='postgres'
|
|
|
|
make test
|
|
|
|
```
|
2014-08-11 01:42:57 +00:00
|
|
|
|
2014-08-13 12:06:02 +00:00
|
|
|
## Alternatives
|
2014-08-11 01:42:57 +00:00
|
|
|
|
2014-08-13 00:38:29 +00:00
|
|
|
* https://bitbucket.org/liamstask/goose
|
2014-08-15 00:35:23 +00:00
|
|
|
* https://github.com/tanel/dbmigrate
|
|
|
|
* https://github.com/BurntSushi/migration
|
2014-08-15 11:51:04 +00:00
|
|
|
* https://github.com/DavidHuie/gomigrate
|
2015-02-09 19:18:33 +00:00
|
|
|
* https://github.com/rubenv/sql-migrate
|
2014-08-13 00:38:29 +00:00
|
|
|
|
|
|
|
|