Skip to content

Moranilt/pms

Repository files navigation

Go Reference

pms

Personal Migration System. CLI and GO package.

Homebrew

Pull Request

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!

Supported drivers

  • MySQL (4.1+)
  • MariaDB
  • Percona Server
  • Google CloudSQL or Sphinx (2.2.3+)
  • PostgreSQL

How to use

Install package

go get github.com/Moranilt/pms

Make folder

First of all you should create a folder where to store migration-files:

mkdir migrations

Make files

To create a migration file you should follow template {version}_{any_name}.{action}.sql where:

  • version - version of migrations
  • any_name - name which associated with queries inside(whatever you want)
  • action - only up or down

Example:

- 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;

Run

After first run it'll create migrations table in your DB. Do not delete or update it!

Inside of GO application

Up

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)
	}
}

Down

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)
	}
}

Version

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)
	}
}

CMD

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