LoginSignup
0
0

More than 1 year has passed since last update.

golangでpostgresを操作する。

Posted at

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は多機能で柔軟な処理が行える反面、覚えることも多いです。
ただ、基本さえ押さえておけば、混乱することは少ないと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0