- Notifications
You must be signed in to change notification settings - Fork1.5k
Database migrations. CLI and Golang library.
License
golang-migrate/migrate
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Database migrations written in Go. Use asCLI or import aslibrary.
- Migrate reads migrations fromsourcesand applies them in correct order to adatabase.
- 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 frommattes/migrate
Database drivers run migrations.Add a new database?
- PostgreSQL
- PGX v4
- PGX v5
- Redshift
- Ql
- Cassandra / ScyllaDB
- SQLite
- SQLite3 (todo #165)
- SQLCipher
- MySQL / MariaDB
- Neo4j
- MongoDB
- CrateDB (todo #170)
- Shell (todo #171)
- Google Cloud Spanner
- CockroachDB
- YugabyteDB
- ClickHouse
- Firebird
- MS SQL Server
- rqlite
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¶m2=false
Anyreserved URL characters need to be escaped. Note, the% character alsoneeds 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$
Source drivers read migrations from local or remote sources.Add a new source?
- Filesystem - read from filesystem
- io/fs - read from a Goio/fs
- Go-Bindata - read from embedded binary data (jteeuwen/go-bindata)
- pkger - read from embedded binary data (markbates/pkger)
- GitHub - read from remote GitHub repositories
- GitHub Enterprise - read from remote GitHub Enterprise repositories
- Bitbucket - read from remote Bitbucket repositories
- Gitlab - read from remote Gitlab repositories
- AWS S3 - read from Amazon Web Services S3
- Google Cloud Storage - read from Google Cloud Platform Storage
- 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)
$ migrate -source file://path/to/migrations -database postgres://localhost:5432/database up 2
$ docker run -v {{ migration dir }}:/migrations --network host migrate/migrate -path=/migrations/ -database postgres://localhost:5432/database up 2- API is stable and frozen for this release (v3 & v4).
- UsesGo modules to manage dependencies.
- To help prevent database corruptions, it supports graceful stops via
GracefulStop chan bool. - Bring your own logger.
- Uses
io.Readerstreams internally for low memory overhead. - Thread-safe and no goroutine leaks.
import ("github.com/golang-migrate/migrate/v4" _"github.com/golang-migrate/migrate/v4/database/postgres" _"github.com/golang-migrate/migrate/v4/source/github")funcmain() {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")funcmain() {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}
Go togetting started
(more tutorials to come)
Each migration has an up and down migration.Why?
1481574547_create_users_table.up.sql1481574547_create_users_table.down.sql
Best practices: How to write migrations.
Check outmigradaptor.Note: migradaptor is not affiliated or supported by this project
| 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) orimport "gopkg.in/golang-migrate/migrate.v3" (not recommended) | DO NOT USE - No longer supported |
Yes, please!Makefile is your friend,read thedevelopment guide.
Also have a look at theFAQ.
Looking for alternatives?https://awesome-go.com/#database.
About
Database migrations. CLI and Golang library.
Topics
Resources
License
Contributing
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.