golangでormなしにpostgresを操作する機会があり、色々学びがあったのでまとめ見たいと思います。
使用ライブラリ
github.com/lib/pq
database/sql
#配列
postgresには配列型があり、柔軟に複数の値を操作できます。
集約関数から、マッチした値を配列に変換してDISTINCTを掛ければ一意な値の配列が得られたりします(速さは保証しません)。
golangで書く場合は以下の通りです。
targetIds = []int{400,500}
// queryに配列を埋め込む
db.Query(`SELECT * FROM t WHERE id = ANY($1)`, pq.Array(targetIds))
// query結果を配列に変換する
var x []sql.NullInt64
db.QueryRow(`SELECT ARRAY[235, 401]`).Scan(pq.Array(&x))
pg.Array
関数でgolangの配列 <-> query を簡単に行えます。
#json
postgresにはjson型があり、mysqlと比べると簡単にデータを整形できます。jsonをカラムとして変換したりなど扱いやすい形に変換できます。
今回は単純にjson型からデータを引っ張る場合です。
// 書き込み
insertQuery := "INSERT into t jsonColumn (jsonData) values($1)"
d, _ := json.Marshal(newData)
db.Exec(insertQuery, d)
// 読み込み
selectQuery := "SELECT jsonColumn FROM t"
row, _ := db.QueryRow(selectQuery)
var jsonRaw null.String
row.scan(row, &jsonRaw)
var resultStruct <適当な構造体>
json.Unmarshal([]byte(jsonRaw), &resultStruct)
単純に jsonに変換して埋め込むだけでOKです。
jsonパッケージを利用しましょう。
#pkを返す
postgresはinsertした瞬間にpkがあればそれを返してくれます。
golangだと以下の通り
var targetId int
insertMasterQuery := "INSERT INTO t (id) VALUES (DEFAULT) RETURNING id;"
err := database.QueryRow(insertMasterQuery, newsId).Scan(&targetId)
#最後に
おそらく、本番で使う場合はormなどと組み合わせることとなります。postgresは多機能で柔軟な処理が行える反面、覚えることも多いです。
ただ、基本さえ押さえておけば、混乱することは少ないと思います。