MCPcopy
hub / github.com/golang-migrate/migrate

github.com/golang-migrate/migrate @v4.19.1 sqlite

repository ↗ · DeepWiki ↗ · release v4.19.1 ↗
1,003 symbols 3,951 edges 142 files 220 documented · 22%
README

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 (includes CLI install instructions)

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.Steps(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.

Coming from another db migration tool?

Check out migradaptor. Note: migradaptor is not affiliated or supported by this project

Versions

Version Supported? Import Notes
master :white_check_mark: import "github.com/golang-migrate/migrate/v4" New features and bug fixes arrive here first
v4 :white_check_mark: import "github.com/golang-migrate/migrate/v4" Used for stable releases
v3 :x: 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.

Extension points exported contracts — how you extend this code

Logger (Interface)
Logger is an interface so you can pass in your own logging implementation. [1 implementers]
log.go
Driver (Interface)
Driver is the interface every database driver must implement. How to implement a database driver? 1. Implement this int
database/driver.go
Handler (FuncType)
Handler handles a single migration parsed from a multi-statement migration. It's given the single migration to handle an
database/multistmt/parse.go
Driver (Interface)
Driver is the interface every source driver must implement. How to implement a source driver? 1. Implement this interfa
source/driver.go
Instance (Interface)
(no doc) [1 implementers]
testing/testing.go
IsReadyFunc (FuncType)
(no doc)
testing/testing.go
TestFunc (FuncType)
(no doc)
testing/testing.go

Core symbols most depended-on inside this repo

Close
called by 196
source/driver.go
Error
called by 142
database/error.go
Run
called by 132
database/driver.go
ParallelTest
called by 97
dktesting/dktesting.go
Open
called by 60
source/driver.go
Println
called by 54
internal/cli/log.go
Port
called by 48
testing/testing.go
Next
called by 38
source/driver.go

Shape

Function 486
Method 409
Struct 96
FuncType 5
Interface 4
TypeAlias 3

Languages

Go100%

Modules by API surface

migrate_test.go36 symbols
source/go_bindata/testdata/bindata.go34 symbols
migrate.go32 symbols
source/go_bindata/examples/migrations/bindata.go26 symbols
database/pgx/pgx.go23 symbols
database/mongodb/mongodb.go22 symbols
database/postgres/postgres_test.go19 symbols
database/postgres/postgres.go18 symbols
database/pgx/v5/pgx.go18 symbols
database/pgx/pgx_test.go18 symbols
database/yugabytedb/yugabytedb.go17 symbols
database/pgx/v5/pgx_test.go17 symbols

Dependencies from manifests, versioned

cel.dev/exprv0.24.0 · 1×
cloud.google.com/gov0.121.6 · 1×
cloud.google.com/go/auth/oauth2adaptv0.2.8 · 1×
cloud.google.com/go/compute/metadatav0.8.0 · 1×
cloud.google.com/go/longrunningv0.6.7 · 1×
cloud.google.com/go/monitoringv1.24.2 · 1×
cloud.google.com/go/spannerv1.85.0 · 1×
cloud.google.com/go/storagev1.56.0 · 1×
github.com/99designs/go-keychainv0.0.0-2019100805025 · 1×
github.com/99designs/keyringv1.2.1 · 1×

Datastores touched

helloCollection · 1 repos
postgresDatabase · 1 repos
(mysql)Database · 1 repos
(mongodb)Database · 1 repos
dbDatabase · 1 repos
adminDatabase · 1 repos
dbnameDatabase · 1 repos
testMigrationDatabase · 1 repos

For agents

$ claude mcp add migrate \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact