M1 Mac環境でOracleClientを利用する（Go言語）

M1 MacでGo言語を利用してOracleに接続する処理を開発したいが、OracleClientにはM1 Macに対応したClientが提供されていません。[Rosetta2](https://support.apple.com/ja-jp/HT211861)を利用して動作確認した際の設定をまとめます

以下のようにIntel x86版しかない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635433/e654c902-57d7-1ef5-3064-04188360091b.png)
https://www.oracle.com/jp/database/technologies/instant-client/downloads.html


## 前提
・OracleClient x86_64版がインストールされている
・Goがインストールされている

# まずは動かしてみる

環境確認
```
~ % uname -m
arm64
```

Oracleに接続するコードを用意
[こちら](https://qiita.com/kpppn/items/a65b855b6e758ed90796)の記事を参考させていただきました
```
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版用のターミナルを用意して起動
[こちら](https://qiita.com/funatsufumiya/items/cec08f1ba3387edc2eed)の記事を参考にさせていただきました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635433/92395732-029e-26e6-f0ff-a6a308a0062f.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:
＜省略＞
```
[こちら](https://github.com/golang/go/issues/43343)の情報を参考に環境変数を設定しました
```
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って提供されないの？
あまり、これといった情報は見つけられなかったのですが、[こちら](https://github.com/oracle/python-cx_Oracle/issues/617)では、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