migrate

https://github.com/golang-migrate/migrate



https://github.com/golang-migrate/migrate/tree/master/database/mysql



https://github.com/rubenv/sql-migrate

https://www.ctolib.com/sql-migrate.html
sql-migrate 是一个 Go 语言的数据库 Schema 移植工具。



特性:



可作为 CLI 命令行工具或者开发库使用



支持 SQLite, PostgreSQL, MySQL, MSSQL 和 Oracle 数据库 (使用 gorp)



可嵌入到应用程序



使用 SQL 定义移植过程



原子迁移



可对移植过程进行撤回



在一个项目中支持多种数据库类型



安装 go-bindata
go get -u github.com/jteeuwen/go-bindata/…
This package converts any file into managable Go source code. Useful for embedding binary data into a go program. The file data is optionally gzip compressed before being converted to a raw byte slice.



这里我借助go-bindata 把我写好的sql文件,生成go源码,加入到工程中



安装 sql-migrate



go get -v github.com/rubenv/sql-migrate/…



sql-migrate
SQL Schema migration tool for Go. Based on gorp and goose.



这里我借助它 在数据库中 初始化一些我需要的表格 索引等



创建 postgres 用户及 数据库



postgres=# CREATE USER dbuser WITH PASSWORD ‘123456’;
CREATE ROLE
postgres=# CREATE DATABASE exampledb OWNER dbuser;
CREATE DATABASE
postgres=# GRANT ALL PRIVILEGES ON DATABASE exampledb TO dbuser;
GRANT



新建 migrations 目录,新建一个sql文件



~/go/gopath/src/wjs/learnSqlMigrations $ ls
main.go migrations
~/go/gopath/src/wjs/learnSqlMigrations/migrations $ ls
1_init.sql



sql 内容,创建student 和 people 表格,



~/go/gopath/src/wjs/learnSqlMigrations/migrations $ cat 1_init.sql
– +migrate Up
create table student (
id text primary key,
name varchar(100) unique not null,
description text not null
);



CREATE TABLE people (id int);



– +migrate Down
drop table student;
drop table people;



新建 main.go 文件



//go:generate go-bindata -prefix migrations -pkg bdata -o bdata/migrations_gen.go migrations
package main



import (
“fmt”
“time”
“wjs/learnSqlMigrations/bdata”
“github.com/pkg/errors”
migrate “github.com/rubenv/sql-migrate”
log “github.com/sirupsen/logrus”



"github.com/jmoiron/sqlx"
_ "github.com/lib/pq" )


var g_db *sqlx.DB



// OpenDatabase opens the database and performs a ping to make sure the
// database is up.
func OpenDatabase(dsn string) (*sqlx.DB, error) {
db, err := sqlx.Open(“postgres”, dsn)
if err != nil {
return nil, fmt.Errorf(“database connection error: %s”, err)
}
for {
if err := db.Ping(); err != nil {
log.Errorf(“ping database error, will retry in 2s: %s”, err)
time.Sleep(2 * time.Second)
} else {
break
}
}
return db, nil
}



func setPostgreSQLConnection() error {
log.Info(“connecting to postgresql”)
db, err := OpenDatabase(“postgres://dbuser:123456@localhost/exampledb?sslmode=disable”)
if err != nil {
return errors.Wrap(err, “database connection error”)
}
g_db = db
return nil
}



func runDatabaseMigrations() error {
log.Info(“applying database migrations”)
m := &migrate.AssetMigrationSource{
Asset: bdata.Asset,
AssetDir: bdata.AssetDir,
Dir: “”,
}
n, err := migrate.Exec(g_db.DB, “postgres”, m, migrate.Up)
if err != nil {
return errors.Wrap(err, “applying migrations failed”)
}
log.WithField(“count”, n).Info(“migrations applied”)



return nil }


func main() {
setPostgreSQLConnection()
err := runDatabaseMigrations()
if err != nil {
log.Error(err)
}
}
运行 go generate



就会生成 migrations_gen.go 文件,里面保存了 1_init.sql 文件的内容



我们来看 main.go 第一行



//go:generate go-bindata -prefix migrations -pkg bdata -o bdata/migrations_gen.go migrations



-pkg 指定了生成的bindata文件包名是 bdata



-o bdata/migrations_gen.go 指定了生成bindata文件的位置



-prefix migrations 如果待转换文件路径前缀有 migrations 则,去掉这个前缀, 参考生成的migrations_gen.go源码



运行 go run main.go



exampledb=> \d
public | gorp_migrations | table | dbuser
public | people | table | dbuser



https://blog.csdn.net/wangjunsheng/article/details/80901895



Category golang