Skip to content
Database migrations. CLI and Golang library.
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
cli Add guide for installing a specific version of `migrate` using the Go… Nov 28, 2018
cmd/migrate Copy cli main package under migrate directory, keep deprecated origin… Nov 21, 2018
database Update to golangci-lint v1.16.0 Apr 7, 2019
dktesting Update dktest from v0.2.0 to v0.3.0 Jan 9, 2019
internal/cli Fixes for unused linter Mar 22, 2019
source Fixes for govet Mar 22, 2019
testing Update golangci-lint config and implore contributors to use it Mar 29, 2019
.golangci.yml Update golangci-lint config and implore contributors to use it Mar 29, 2019
.travis.yml Remove spurious list item Mar 29, 2019
Dockerfile Update Dec 14, 2018
LICENSE Link to comparison of transactional DDLs Jul 10, 2018
Makefile Include firebird db driver in default builds Apr 6, 2019
log.go add some more comments Feb 10, 2017
migrate.go Added misspell linter Mar 22, 2019
util_test.go Improve error output for missing or malformed '-database' and '-sourc… Aug 8, 2018

Build Status GoDoc Coverage Status Docker Pulls Supported Go Versions GitHub Release


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


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?option1=true&option2=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!#$%&'()*+,/:;=?@[]
$ python2 -c 'import urllib; print urllib.quote(raw_input("String to encode: "), "")'
String to encode: FAKEpassword!#$%&'()*+,/:;=?@[]

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 (
    _ ""
    _ ""

func main() {
    m, err := migrate.New(

Want to use an existing database client?

import (
    _ ""
    _ ""

func main() {
    db, err := sql.Open("postgres", "postgres://localhost:5432/database?sslmode=enable")
    driver, err := postgres.WithInstance(db, &postgres.Config{})
    m, err := migrate.NewWithDatabaseInstance(
        "postgres", driver)

Migration files

Each migration has an up and down migration. Why?


Best practices: How to write migrations.


Version Supported? Import Notes
master import "" New features and bug fixes arrive here first
v4 import "" Used for stable releases
v3 import "" (with package manager) or import "" (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?

You can’t perform that action at this time.