M1 MacでGo言語を利用してOracleに接続する処理を開発したいが、OracleClientにはM1 Macに対応したClientが提供されていません。Rosetta2を利用して動作確認した際の設定をまとめます
以下のようにIntel x86版しかない
https://www.oracle.com/jp/database/technologies/instant-client/downloads.html
前提
・OracleClient x86_64版がインストールされている
・Goがインストールされている
まずは動かしてみる
環境確認
~ % uname -m
arm64
Oracleに接続するコードを用意
こちらの記事を参考させていただきました
package main
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-oci8"
)
func getDSN() string {
return "user/password@oraclerac.com:1521/sv_test"
}
func testSelect(db *sql.DB) error {
rows, err := db.Query("SELECT username,profile FROM dba_users where rownum<=1")
if err != nil {
return err
}
defer rows.Close()
for rows.Next() {
var username string
var profile string
rows.Scan(&username, &profile)
println(username, profile)
}
return nil
}
func main() {
db, err := sql.Open("oci8", getDSN())
if err != nil {
fmt.Println(err)
return
}
defer db.Close()
if err = testSelect(db); err != nil {
fmt.Println(err)
return
}
}
実行してみるが、以下のような感じでエラーが出る
go-oracle-sample % go version
go version go1.21.5 darwin/arm64
go-oracle-sample % go run test.go
# command-line-arguments
/usr/local/go/pkg/tool/darwin_arm64/link: running clang failed: exit status 1
ld: warning: ignoring file /usr/local/oracle/instantclient_19_8//libclntsh.dylib, building for macOS-arm64 but attempting to link with file built for macOS-x86_64
Undefined symbols for architecture arm64:
"_OCIAttrGet", referenced from:
<省略>
Intel版のターミナルを用意する
まずは、Rosettaをインストール
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
次にIntel x86_64版用のターミナルを用意して起動
こちらの記事を参考にさせていただきました
~ % uname -m
x86_64
~ % cat .zshrc
arch=`uname -m`
if [ "$arch" = "x86_64" ]; then
export PATH=$PATH:/opt/homebrew-x86_64/bin
else
export PATH=$PATH:/opt/homebrew/bin
fi
再度実行する
変わらずエラーが発生
go-oracle-sample % go run test.go
# command-line-arguments
/usr/local/go/pkg/tool/darwin_arm64/link: running clang failed: exit status 1
ld: warning: ignoring file /usr/local/oracle/instantclient_19_8//libclntsh.dylib, building for macOS-arm64 but attempting to link with file built for macOS-x86_64
Undefined symbols for architecture arm64:
<省略>
こちらの情報を参考に環境変数を設定しました
go-oracle-sample % export GOARCH=amd64 go build
go-oracle-sample % export CGO_ENABLED=1
go-oracle-sample % go run test.go
dyld[23845]: Library not loaded: @rpath/libclntsh.dylib.19.1
Referenced from: <411CC6F2-37FB-3CA1-BF0E-9AF04263E723> /private/var/folders/9_/bkgnvjg56qx8nwm0dgr51snc0000gr/T/go-build3090349855/b001/exe/test
Reason: tried: '/usr/local/lib/libclntsh.dylib.19.1' (no such file), '/usr/lib/libclntsh.dylib.19.1' (no such file, not in dyld cache)
ライブラリが読みこめていない旨のエラーが発生
DYLD_LIBRARY_PATHにOracleClientのライブラリのパスを設定しました
go-oracle-sample % export DYLD_LIBRARY_PATH=/usr/local/oracle/instantclient_19_8
go-oracle-sample % go run test.go
SYS DEFAULT
どうやら、うまく実行できたようです
今回は設定しませんでしたが、リリース環境に合わせてGOOSなど必要な環境変数も設定します
M1/2 Mac対応のOracleClientって提供されないの?
あまり、これといった情報は見つけられなかったのですが、こちらでは、M1 MacのOracleClientについて議論されているようです。Rosetta2で対応できるから提供されないかもといった意見もあるようです、、、
最後に
既に知られている内容が多かったのですが、M1 Macに対応したOracleClientが提供されていないことに少し残念で書いてみました。将来的に提供されれば嬉しいなと思います。
(Rosetta2が必要なケースはOracleClientに限った話しではないということと、あまり需要がないのかもしれませんが)
参考
https://developers.ascendcorp.com/how-to-install-oracle-instant-client-on-apple-silicon-m1-24b67f2dc743
https://github.com/golang/go/issues/43343
https://github.com/oracle/python-cx_Oracle/issues/617
https://qiita.com/kpppn/items/a65b855b6e758ed90796
https://qiita.com/funatsufumiya/items/cec08f1ba3387edc2eed
https://qiita.com/Y_uuu/items/db274e2d3eba3cd5c0dd