数据库migrate工具有很多,但基于Golang且较为流行的有sql-migrate和migrate,但都不支持Oracle。前段时间项目上正好使用到Oracle,索性提交了个PR来支持Oracle.
对比sql-migrate和migrate
- sql-migrate是个轻量级的migrate工具,同时支持代码集成。这意味服务启动时可方便的管理sql版本。
- migrate也是个migrate工具,同时支持代码集成。不同的是sql-migrate支持bindatq,而migrate不支持。
Oracle驱动
- oci8(github.com/mattn/go-oci8)
- godror(https://github.com/godror/godror)
oci8和godror都不是pure Go代码的驱动库,他们都需要Oracle Office Client (Instant Client)的支持。两相相比较,个人使用godror较多,因为godror是运行时依赖,编译是不依赖Oracle的lib库。sql-migrate两种驱动都支持。
使用编译tag
代码中加入golang的条件编译就能轻松实现。sql-migrate默认提供的工具是不支持oracle,需要你编译oracle版本
1
| go get -tags godror -v github.com/rubenv/sql-migrate/...
|
使用sql-migrate
下载依赖并配置依赖库路径
1
| wget https://download.oracle.com/otn_software/mac/instantclient/193000/instantclient-basic-macos.x64-19.3.0.0.0dbru.zip
|
1
| export LD_LIBRARY_PATH=your_oracle_office_path/instantclient_19_3
|
配置文件样例
1 2 3 4 5
| development: dialect: godror datasource: user/password@localhost:1521/sid dir: migrations/oracle table: migrations
|
最后使用sql-migrate命令行
作为library
1 2 3 4 5 6 7 8 9 10 11 12 13
| import "github.com/rubenv/sql-migrate" import _ "github.com/godror/godror"
db, err := sql.Open("sqlite3", filename) if err != nil { }
n, err := migrate.Exec(db, "godror", migrations, migrate.Up) if err != nil { } fmt.Printf("Applied %d migrations!\n", n)
|
PR
https://github.com/rubenv/sql-migrate/pull/166