【Golang】Go言語からPostgreSQLを使う【sql, lib/pq】

前回のプログラムを改良してPostgreSQLを使ってメッセージを返すように改良してみました。


【Golang】公開鍵と共通鍵で暗号化する【rsa, aes, pem, x509, cipher】 - くどはむと猫の窓

 

今回は以下を参考にしました。

 

ほとんどここに書いてあるサンプルの通りです。

まずはdatabase/sqlと使用するデータベースのDriverパッケージをインポートする必要があります。今回はPostgreSQLを使用するのでgithub.com/lib/pqパッケージを使います。

その他のDriverパッケージについてはここに一覧があるので参考にしてください。

SQLDrivers - go-wiki - SQL database drivers - Go Language Community Wiki - Google Project Hosting

インポートはこのような感じです。

import (
	_ "github.com/lib/pq"
	"database/sql"
)

この_(アンダースコア)はブランク修飾子呼ばれるものです。

/lib/pqパッケージは直接は使われません。sql/driverパッケージからインターフェースを通して呼び出されます。

しかしGo言語では直接呼びだしていないパッケージがあるとコンパイル時に怒られます。そこでブランク修飾子を使用し、参照だけしてパッケージの中身を直接使わないことを明示的に宣言することでコンパイルエラーを回避できるのです。

DBとの接続は

db, err := sql.Open("postgres", "user=username dbname=hogedb password=huga sslmode=disable")
checkError(err)
defer db.Close()

 こんな感じです。接続の仕方はDBの種類によって多少変わるようです。

SSLモードは以下の4つがあり、今回はDBとの接続にSSLは使っていません。

disable SSLを使用しない
require SSLを使用するが証明書の検証はしない
varify-ca SSLを使用し、信頼できるCAによって署名されたものかを検証する
varify-full SSLを使用し、信頼できるCAによって署名されたものか、サーバーのホスト名が証明書に書かれているものと一致するかを検証する

 

返り値のDB型を使ってSQLの発行などができます。

参照系は

rows, err := db.Query("SELECT * FROM hoge WHERE huga = $1;", huga)
checkError(err)

column := 0
for rows.Next() {
  err = rows.Scan(&column)
  checkError(err)
...処理...
}

のように複数件のレコードを取得するQueryと

cnt := 0
err = db.QueryRow("SELECT COUNT(*) AS cnt FROM hoge WHERE huga = $1;", huga).Scan(&cnt)
checkError(err)

のように一件取得するQueryRowがあります。

更新系は

_, err = db.Exec("INSERT INTO hoge_hugas(hoge, huga) VALUES($1, $2);", hogee, hugaa)
checkError(err)

のようにExec関数を使います。

ここらへんの使い方はあまり他の言語と変わりませんね。

 

と、これらを使ってクライアントから送られて来たメッセージをDBに格納しておき、送られて来たメッセージが

  • 初めてのものなら「'msg'...わたし、気になります!」
  • 初めてでないなら「'msg'はもうn回も聞いたのでわたし、気になりません!」

と返すプログラムに改良してみました。

 

実行結果(クライアント側)

f:id:kudohamu:20141129120159j:plain

 

f:id:kudohamu:20141129120303j:plain

 

次は今まで使ったパッケージの総まとめとして少しちゃんとしたプログラムを作ってみようと思います。

それが終わったらWebアプリケーションかなー。ʕ◔ϖ◔ʔ