0%

sql-migrate支持oracle数据库

数据库migrate工具有很多,但基于Golang且较为流行的有sql-migratemigrate,但都不支持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

1
// +build oracle

代码中加入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命令行

1
sql-migrate  up

作为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 {
// Handle errors!
}

n, err := migrate.Exec(db, "godror", migrations, migrate.Up)
if err != nil {
// Handle errors!
}
fmt.Printf("Applied %d migrations!\n", n)

PR

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