GoでDB接続をして何かしらの命令を実行する、という事はやった事がないので勉強がてらではありますが、今更ながらGoからCloud SQLへの接続を行い、対象のテーブルへレコードを追加するという事をやってみます。
Cloud SQLインスタンスの作成
まずはデータベースが無いと始まらないので接続先のデータベースとしてGoogle Cloud Platform(以降GCP)にログインをし、作成していきます。
対象プロジェクトへ移動し、Cloud SQLインスタンスを作成する。
PostgreSQLを選択する。
Cloud SQLに接続可能なIPを指定する。
インスタンスを作成する。
ここまで出来たらデータベースタブを選択しデモ用にデータベースを作成する。
demo
というデータベースを作成。
Cloud Shellを使用して接続してみる
Cloud SQLの対象インスタンスを選択し、Cloud Shellを使用して接続を選択。
# 以下のコマンド後にパスワードを入力する $ gcloud sql connect sample Whitelisting your IP for incoming connection for 5 minutes...done. Connecting to database with SQL user [postgres].Password for user postgres: psql (9.6.15, server 9.6.14) SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off) Type "help" for help. # データベースを指定 postgres=>\c demo # テーブルを作成する demo=> CREATE TABLE demo ( demo(> id SERIAL PRIMARY KEY, demo(> name TEXT NOT NULL, demo(> hobby TEXT NOT NULL); CREATE TABLE
テーブルの作成が出来たので、データがない事を確認する
demo=> SELECT * FROM demo; id | name | hobby ----+------+------- (0 rows)
ここまで確認出来たらデータベース側の事前準備は終了です。
Go側の準備
PostgreSQL用のドライバをインストールする
go get github.com/lib/pq
Go側のプログラムを書いていく
コードの内容としては薄いので今回はこれのみです。
// main.go package main import ( "database/sql" // 直接使わないので無名インポートしておく _ "github.com/lib/pq" "log" ) // 接続文字列(hoge部分は自身の環境に合わせて下さい) const connectionString = "host=hoge port=5432 user=postgres password=hoge dbname=demo" func main() { db, err := sql.Open("postgres", connectionString) // main関数を抜けたら実行 defer db.Close() // errがあったらlogへ書き込み if err != nil { log.Fatal(err) } ret, err := db.Exec(`INSERT INTO demo(name, hobby) VALUES('tanabe', 'programming')`) // errがあったらlogへ書き込み if err != nil { log.Fatal(err) } // logへ結果を書き込み log.Println(ret) }
結果が反映されているかを確認する
cloud shell
からSQLを実行してテーブルにデータが書き込まれたかを確認する。
demo=> SELECT * FROM demo; id | name | hobby ----+--------+------------- 1 | tanabe | programming (1 row)
これでGoからテーブルへデータの書き込みが出来ました。
まとめ
どうだったでしょうか。Go側の実装はとてもシンプルで全く難しいと思った事はないかと思います。今回の例で言うとCloud SQL側の事前準備の方が時間がかかったかと思います。SQLを実行する前にデータベースへの疎通確認はいいの?と思うかも知れませんがExec
を実行する際に事前に実行されるのであえて実装する必要はないと考えており今回は行っておりません。個人的な感覚ではありますが、ORMを使用せずに、ここまでシンプルに接続と命令が可能なので本当にこれで良いの?と思うくらい取っ付きやすかったです。
参考URL
github.com Cloud SQL for PostgreSQL のクイックスタート | Cloud SQL for PostgreSQL | Google Cloud