GAE上でGOを動かして、そこから外部のMySQLに接続するのに躓いたのでメモをしておきます。
どうやら、GAEからはSocketAPIなるものを使わないと外部には接続できないようです。
ローカルで動作しましたが、GAEにアップするとヌルポがでるので、最初はわかりませんでした。
解決コードはあっさりしてます。
importは省いています。
サンプル
sample.go(抜粋)
dsn := con.User + ":" + con.Password + "@external(" + con.Address + ":" + strconv.Itoa(con.Port) + ")/" + con.Name
dial := func(addr string) (net.Conn, error) {
return socket.Dial(appengine.NewContext(r), "tcp", addr)
}
mysql.RegisterDial("external", dial)
db, err := sql.Open("mysql",dsn)
externalという名前のDialを作成し、mysqlに登録するだけです。
DSNではいつもは、@tcpとなるところが登録名@externalになるだけです。
Go+GAEではvendor関係とかつまづきまくっていますが、総じてGo言語の生産性と実行速度は十分に満足がいくものです。
###追加
Go1.11でなんとかなるかもしれないので、今度試してみます
https://github.com/gcpug/nouhau/tree/feature/id/76/app-engine/note/gaego19-migration-gaego111