GoからGoogle Cloud SQLへ接続を行いデータを登録する

f:id:tanabebe:20190908221629p:plain GoでDB接続をして何かしらの命令を実行する、という事はやった事がないので勉強がてらではありますが、今更ながらGoからCloud SQLへの接続を行い、対象のテーブルへレコードを追加するという事をやってみます。

Cloud SQLインスタンスの作成

まずはデータベースが無いと始まらないので接続先のデータベースとしてGoogle Cloud Platform(以降GCP)にログインをし、作成していきます。

対象プロジェクトへ移動し、Cloud SQLインスタンスを作成する。 f:id:tanabebe:20190908200705p:plain

PostgreSQLを選択する。 f:id:tanabebe:20190908200747p:plain

Cloud SQLインスタンスに必要な情報を入力する。 f:id:tanabebe:20190908200818p:plain

Cloud SQLに接続可能なIPを指定する。 f:id:tanabebe:20190908200846p:plain

インスタンスを作成する。 f:id:tanabebe:20190908200851p:plain

ここまで出来たらデータベースタブを選択しデモ用にデータベースを作成する。 f:id:tanabebe:20190908204744p:plain

demoというデータベースを作成。 f:id:tanabebe:20190908204801p:plain

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