Database migrations. CLI and Golang library.
Alternatives To Migrate
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Migrate11,6055942 days ago129March 17, 2022273otherGo
Database migrations. CLI and Golang library.
Flyway7,2034,0444423 days ago156September 08, 2022118apache-2.0Java
Flyway by Redgate • Database Migrations Made Easy.
a month ago1February 27, 2018295otherCommon Lisp
Migrate to PostgreSQL in a single command!
Phinx4,3763,4944378 days ago82January 21, 2022137mitPHP
PHP Database Migrations for Everyone
Goose3,98065992 days ago46August 29, 202258otherGo
A database migration tool. Supports SQL migrations and Go functions.
Dbmate3,432110 days ago27March 25, 202216mitGo
:rocket: A lightweight, framework-agnostic database migration tool.
Fluentmigrator2,9555481304 days ago52January 14, 2022221apache-2.0C#
Fluent migrations framework for .NET
Express Typescript Boilerplate2,946
a month ago94mitTypeScript
A delightful way to building a RESTful API with NodeJs & TypeScript by @w3tecch
2 years ago61gpl-3.0Python
Bittorrent software for cats
Simplebank2,59412 months ago6April 11, 20214mitGo
Backend master class: build a simple bank service in Go
Alternatives To Migrate
Select To Compare

Alternative Project Comparisons

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


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

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/database/postgres"
    _ "github.com/golang-migrate/migrate/v4/source/github"

func main() {
    m, err := migrate.New(
        "github://mattes:[email protected]/migrate_test",

Want to use an existing database client?

import (
    _ "github.com/lib/pq"
    _ "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(
        "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


(more tutorials to come)

Migration files

Each migration has an up and down migration. Why?


Best practices: How to write migrations.


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.

Popular Migration Projects
Popular Database Projects
Popular Data Processing Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Aws S3
Google Cloud Storage