1
0

M1 Mac環境でOracleClientを利用する(Go言語)

Last updated at Posted at 2024-01-15

M1 MacでGo言語を利用してOracleに接続する処理を開発したいが、OracleClientにはM1 Macに対応したClientが提供されていません。Rosetta2を利用して動作確認した際の設定をまとめます

以下のようにIntel x86版しかない
image.png
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版用のターミナルを用意して起動
こちらの記事を参考にさせていただきました
image.png

 ~ % 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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0