golang-migrate 数据库迁移工具

rails 项目中自带 migration 是非常好用的数据库迁移工具,方便我们在开发中根据需求去记录数据表的创建、修改等历史版本

golang-migrate 是 go 项目中的数据库迁移工具,已经可以大概实现 rails 中 migration 的功能

macos 中可以用 homebrew 安装它 golang-migrate

brew install golang-migrate

创建迁移脚本,这会生成两个迁移脚本

 migrate create -ext sql -dir configs/db/migration -seq create_roles_table

001_create_sys_roless_table.down.sql

DROP TABLE IF EXISTS sys_roles;

001_create_sys_roles_table.up.sql

BEGIN;
-- 角色
CREATE TABLE IF NOT EXISTS sys_roles(
   "id" bigserial PRIMARY KEY,
   "name" varchar (50) NOT NULL,
   "status"  int NOT NULL DEFAULT (0),
   "weigh"  int NOT NULL DEFAULT (0),
   "data_scope" int NOT NULL DEFAULT (2),
   "remark" varchar (300),
   "creator_id" int DEFAULT (0),
   "updator_id" int DEFAULT (0),
   "created_at" timestamptz NOT NULL DEFAULT (now()),
   "updated_at" timestamptz NOT NULL DEFAULT (now()),
   "deleted_at" timestamptz DEFAULT NULL
);

COMMENT ON TABLE "sys_roles" IS '角色表';
COMMENT ON COLUMN "sys_roles"."status" IS 'must be positive';
COMMENT ON COLUMN "sys_roles"."data_scope" IS '数据范围';


COMMIT;

创建一个 Makefile 文件::

ifndef ENV
	DATABASE_HOST=localhost
	DATABASE_PORT=5432
	DATABASE_USER=xxx
	DATABASE_PASSWORD=xxx
	DATABASE_NAME=pmhuang_dev
endif

ifeq ($(ENV),dev)
	DATABASE_NAME=pmhuang_dev
endif

ifeq ($(ENV),test)
	DATABASE_NAME=pmhuang_test
endif

ifeq ($(ENV),prod)
	DATABASE_NAME=pmhuang_production
endif

createdb:
	createdb  -h $(DATABASE_HOST) -p$(DATABASE_PORT) -U$(DATABASE_USER) --owner=$(DATABASE_USER)  $(DATABASE_NAME)

dropdb:
	dropdb -h $(DATABASE_HOST) -p$(DATABASE_PORT) -U$(DATABASE_USER)  $(DATABASE_NAME)

migrateup:
	migrate -path configs/db/migration -database "postgresql://$(DATABASE_USER):$(DATABASE_PASSWORD)@$(DATABASE_HOST):$(DATABASE_PORT)/$(DATABASE_NAME)?sslmode=disable" -verbose up

migratereset:
	make dropdb && make createdb && make migrateup


.PHONY: dropdb	createdb	migrateup		migratereset

创建数据库:

make createdb

创建表:

make migrateup

回滚重置数据库:

make migratereset

删除数据库:

make dropdb

你也可以基于 docker 使用 go-migrate,这是一个 Dockerfile:

FROM ubuntu:latest
MAINTAINER andrew.zhyl@gmail.com

ENV  TZ="Asia/Shanghai"

RUN apt-get update -q \
  && apt-get -q -y install  ca-certificates tzdata curl postgresql-client vim bash make  --fix-missing --no-install-recommends

# tzdata 校正常见 Linux 系统时区
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime
RUN echo ${TZ} > /etc/timezone
RUN dpkg-reconfigure -f noninteractive tzdata

# 安装 go-migrate
RUN curl -L https://github.com/golang-migrate/migrate/releases/download/v4.11.0/migrate.linux-amd64.tar.gz | tar xvz
RUN mv ./migrate.linux-amd64 /usr/bin/migrate

RUN mkdir -p /opt/

WORKDIR /opt/

RUN mkdir -p ./log
COPY configs ./configs
COPY Makefile .

CMD ["/bin/bash"] 

本文仅为个人记录,不够详尽,有疑问可以看其它的资料