Personal Migration System. CLI and GO package.
To make it easier to install with Homebrew, this package should be more notable to deploy it(>30 forks, >=30 watchers and >=75 stars). Please support this package!
- MySQL (4.1+)
- MariaDB
- Percona Server
- Google CloudSQL or Sphinx (2.2.3+)
- PostgreSQL
go get github.com/Moranilt/pms
First of all you should create a folder where to store migration-files:
mkdir migrations
To create a migration file you should follow template {version}_{any_name}.{action}.sql
where:
version
- version of migrationsany_name
- name which associated with queries inside(whatever you want)action
- onlyup
ordown
- 1_users.up.sql
- 1_users.down.sql
- 2_posts.up.sql
- 2_posts.down.sql
1_users.up.sql:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
1_users.down.sql:
DROP TABLE users;
2_posts.up.sql:
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
2_posts.down.sql:
DROP TABLE posts;
After first run it'll create migrations
table in your DB. Do not delete or update it!
To run all migrations you should use Up
method which will run all files with up
action in file.
If current version 2
and you have files with version up to 5
, Up
method will run all files from 3
to 5
versions.
Example:
package main
import (
"log"
"github.com/Moranilt/pms"
"github.com/jmoiron/sqlx"
)
func main() {
conn := "host=localhost dbname=postgres user=root password=1234 port=5432 sslmode=disable"
db, err := sqlx.Connect("postgres", conn)
if err != nil {
log.Fatal("error while connecting to db", err)
}
migrator, err := pms.New(db, "./migrations")
if err != nil {
log.Fatal(err)
}
err = migrator.Up()
if err != nil {
log.Fatal("failed to run migrations: ", err)
}
}
To run all files with down
action you should use Down
method.
It will run all files with down
actions with descending order starts from the latest version of migration.
package main
import (
"log"
"github.com/Moranilt/pms"
"github.com/jmoiron/sqlx"
)
func main() {
conn := "host=localhost dbname=postgres user=root password=1234 port=5432 sslmode=disable"
db, err := sqlx.Connect("postgres", conn)
if err != nil {
log.Fatal("error while connecting to db", err)
}
migrator, err := pms.New(db, "./migrations")
if err != nil {
log.Fatal(err)
}
err = migrator.Down()
if err != nil {
log.Fatal("failed to run down migrations: ", err)
}
}
You can chose the version to jump to with Version
method. Works like checkout to specific version.
If current version is 5
and you will run migrator.Version(7)
, it will execute all migration files with up
action from 6
to 7
versions.
If current version is 5
and you will run migrator.Version(2)
, it will execute all migration files with down
action from 5
to 3
versions.
package main
import (
"log"
"github.com/Moranilt/pms"
"github.com/jmoiron/sqlx"
)
func main() {
conn := "host=localhost dbname=postgres user=root password=1234 port=5432 sslmode=disable"
db, err := sqlx.Connect("postgres", conn)
if err != nil {
log.Fatal("error while connecting to db", err)
}
migrator, err := pms.New(db, "./migrations")
if err != nil {
log.Fatal(err)
}
err = migrator.Version(3)
if err != nil {
log.Fatal("failed to run version migrations: ", err)
}
err = migrator.Version(5)
if err != nil {
log.Fatal("failed to run version migrations: ", err)
}
}
You can find binaries for your system in releases.
Allowed flags:
--help - display all available flags
-db string - Database name
-down - Run all down migrations from provided path
-host string - Database host (default "localhost")
-pass string - Database password
-port int - Database port (default 5432)
-source string - Source of migration files. For example './migrations' (default "migrations")
-up - Run all migrations from provided path
-user string - Database user (default "root")
-v int - Select version of migrations (default -1)
-sslMode string - Set ssl mode (default "disable")
-driver string - Set MySQL driver (default "mysql")
-url string - Connection URL. [driver]://[user]:[pass]@[host]:[port]/[db_name]?[flag_name]=[flag_value]
Example Up
:
pms -driver postgres -db postgres -host localhost -pass secret_pass -source migrations -user root -up
Example Down
:
pms -db postgres -host localhost -pass secret_pass -source migrations -user root -down
Example Version
:
pms -db postgres -host localhost -pass secret_pass -source migrations -user root -v 5
Example URL:
pms -driver postgres -url "postgres://root:123456@localhost:5432/authentication?sslmode=disable" -up