Database migrations. CLI and Golang library.
Перейти к файлу
Ross Rothenstine 08023924e9 Allow for template substitution 2022-07-01 12:40:44 -07:00
.circleci Support Go 1.16 and drop support for Go 1.15 2021-02-18 21:33:36 -08:00
.github Support Go 1.18 and drop support for Go 1.16 2022-05-13 15:45:41 -07:00
cli Clean up CLI docs 2019-06-13 01:30:58 -07:00
cmd/migrate Remove -o option from go install example in CLI docs 2021-07-28 09:06:18 -07:00
database Use t.Skipf() per golangci-lint (gosimple) 2022-05-13 15:59:07 -07:00
dktesting Update dktest from v0.2.0 to v0.3.0 2019-01-08 22:39:26 -08:00
internal Allow for template substitution 2022-07-01 12:40:44 -07:00
source Allow for template substitution 2022-07-01 12:40:44 -07:00
testing Update docker client usage with breaking change 2021-10-12 22:11:20 -07:00
.dockerignore Use make for docker builds so all releases use the same db and source drivers 2020-08-03 16:28:46 -07:00
.gitignore Support for GitHub Actions and goreleaser (#604) 2021-07-30 23:09:32 -07:00
.golangci.yml Update golangci-lint config 2021-09-10 21:02:44 -07:00
.goreleaser.yml Fix docker image tags by undoing previous commit 2021-08-06 21:38:45 -07:00
.travis.yml Update golangci-lint from v1.27.0 to v1.30.0 2020-08-19 02:04:00 -07:00
CONTRIBUTING.md Remove spurious list item 2019-03-28 21:35:54 -07:00
Dockerfile Update docker builds to use Go 1.16 and Alpine Linux 3.13 2021-05-10 11:28:59 -07:00
Dockerfile.circleci Use CircleCI 2021-01-25 21:08:52 -08:00
Dockerfile.github-actions revert binary file location change in docker image 2021-09-27 10:13:33 +02:00
FAQ.md typo 2020-09-17 07:59:02 +02:00
GETTING_STARTED.md Fix small typo in GETTING_STARTED.md (#407) 2020-06-22 10:09:05 -07:00
LICENSE Update copyright in LICENSE 2018-11-08 01:45:19 -08:00
MIGRATIONS.md Update migration docs 2019-07-11 23:05:33 -07:00
Makefile Clean up Makefile targets 2021-08-04 16:19:03 -07:00
README.md Support Go 1.18 and drop support for Go 1.16 2022-05-13 15:45:41 -07:00
docker-deploy.sh Add latest tag to docker image during build 2018-07-03 14:09:26 -07:00
go.mod Update dktest from v0.3.10 to v0.3.11 to fix upstream security issues 2022-05-06 21:59:35 -07:00
go.sum Update dktest from v0.3.10 to v0.3.11 to fix upstream security issues 2022-05-06 21:59:35 -07:00
log.go add some more comments 2017-02-09 18:23:08 -08:00
migrate.go Allow for template substitution 2022-07-01 12:40:44 -07:00
migrate_test.go Include file path in errors from PartialDriver.ReadUp() and ReadDown() (#421) 2020-08-29 16:44:38 -07:00
migration.go Enabled maligned, staticcheck and errcheck linters (#206) 2019-04-26 15:47:16 -07:00
migration_test.go rename Migration.LongString to LogString 2017-02-09 18:06:38 -08:00
util.go len(k) is guaranteed to be greater than 1 in this case 2021-12-08 10:38:36 +08:00
util_test.go Include 2 letter query param key in unit test 2021-12-08 10:38:36 +08:00

README.md

GitHub Workflow Status (branch) GoDoc Coverage Status packagecloud.io Docker Pulls Supported Go Versions GitHub Release Go Report Card

migrate

Database migrations written in Go. Use as CLI or import as library.

  • Migrate reads migrations from sources and applies them in correct order to a database.
  • Drivers are "dumb", migrate glues everything together and makes sure the logic is bulletproof. (Keeps the drivers lightweight, too.)
  • Database drivers don't assume things or try to correct user input. When in doubt, fail.

Forked from mattes/migrate

Databases

Database drivers run migrations. Add a new database?

Database URLs

Database connection strings are specified via URLs. The URL format is driver dependent but generally has the form: dbdriver://username:password@host:port/dbname?param1=true&param2=false

Any reserved URL characters need to be escaped. Note, the % character also needs to be escaped

Explicitly, the following characters need to be escaped: !, #, $, %, &, ', (, ), *, +, ,, /, :, ;, =, ?, @, [, ]

It's easiest to always run the URL parts of your DB connection URL (e.g. username, password, etc) through an URL encoder. See the example Python snippets below:

$ python3 -c 'import urllib.parse; print(urllib.parse.quote(input("String to encode: "), ""))'
String to encode: FAKEpassword!#$%&'()*+,/:;=?@[]
FAKEpassword%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D
$ python2 -c 'import urllib; print urllib.quote(raw_input("String to encode: "), "")'
String to encode: FAKEpassword!#$%&'()*+,/:;=?@[]
FAKEpassword%21%23%24%25%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D
$

Migration Sources

Source drivers read migrations from local or remote sources. Add a new source?

CLI usage

  • Simple wrapper around this library.
  • Handles ctrl+c (SIGINT) gracefully.
  • No config search paths, no config files, no magic ENV var injections.

CLI Documentation

Basic usage

$ migrate -source file://path/to/migrations -database postgres://localhost:5432/database up 2

Docker usage

$ docker run -v {{ migration dir }}:/migrations --network host migrate/migrate
    -path=/migrations/ -database postgres://localhost:5432/database up 2

Use in your Go project

  • API is stable and frozen for this release (v3 & v4).
  • Uses Go modules to manage dependencies.
  • To help prevent database corruptions, it supports graceful stops via GracefulStop chan bool.
  • Bring your own logger.
  • Uses io.Reader streams internally for low memory overhead.
  • Thread-safe and no goroutine leaks.

Go Documentation

import (
    "github.com/golang-migrate/migrate/v4"
    _ "github.com/golang-migrate/migrate/v4/database/postgres"
    _ "github.com/golang-migrate/migrate/v4/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)
}

Want to use an existing database client?

import (
    "database/sql"
    _ "github.com/lib/pq"
    "github.com/golang-migrate/migrate/v4"
    "github.com/golang-migrate/migrate/v4/database/postgres"
    _ "github.com/golang-migrate/migrate/v4/source/file"
)

func main() {
    db, err := sql.Open("postgres", "postgres://localhost:5432/database?sslmode=enable")
    driver, err := postgres.WithInstance(db, &postgres.Config{})
    m, err := migrate.NewWithDatabaseInstance(
        "file:///migrations",
        "postgres", driver)
    m.Up() // or m.Step(2) if you want to explicitly set the number of migrations to run
}

Getting started

Go to getting started

Tutorials

(more tutorials to come)

Migration files

Each migration has an up and down migration. Why?

1481574547_create_users_table.up.sql
1481574547_create_users_table.down.sql

Best practices: How to write migrations.

Versions

Version Supported? Import Notes
master import "github.com/golang-migrate/migrate/v4" New features and bug fixes arrive here first
v4 import "github.com/golang-migrate/migrate/v4" Used for stable releases
v3 import "github.com/golang-migrate/migrate" (with package manager) or import "gopkg.in/golang-migrate/migrate.v3" (not recommended) DO NOT USE - No longer supported

Development and Contributing

Yes, please! Makefile is your friend, read the development guide.

Also have a look at the FAQ.


Looking for alternatives? https://awesome-go.com/#database.