【Golang】DBアクセスしてみる
今回のゴール
PostgreSQLに繋いでデータを取得する
ソースコード
テーブルと紐付くモデル
package model type Record struct { Id int Value string }
今回は数値のIdと文字列Valueを定義しました。
DBにアクセスしたりする処理
package main import ( "./model" "database/sql" "fmt" _ "github.com/lib/pq" "strconv" ) func main() { db, err := sql.Open("postgres", "user=postgres password=pass dbname=test sslmode=disable") //sql := "select * from test" sql := "select * from test where id = $1 AND value = $2" rows, err := db.Query(sql, 1, "test") defer db.Close() defer rows.Close() if err != nil { panic(err) } for rows.Next() { var r model.Record err := rows.Scan(&r.Id, &r.Value) if err != nil { panic(err) } fmt.Println(strconv.Itoa(r.Id) + " " + r.Value) } }
db, err := sql.Open("postgres", "user=postgres password=pass dbname=test sslmode=disable")
これでDBと繋がります。
データ系なのでエラーを受け取ってますが、
その後は雑です。
sql := "select * from test where id = $1 AND value = $2"
SQLは上記のようにパラメータは$で指定しておきます。
実際のクエリ発行時に下記のようにパラメータを指定
rows, err := db.Query(sql, 1, "test")
ここまで終わったらdeferでコネクションと取得データのクローズを指示します。
※deferはjavaのfinallyとかC#のusing的な物です。
上記の書き方だと関数を抜けた時に必ずrows→dbの順番でクローズされます。
あとは、以下のようにループで回しながらデータを表示する等です。
for rows.Next() { var r model.Record err := rows.Scan(&r.Id, &r.Value) if err != nil { panic(err) } fmt.Println(strconv.Itoa(r.Id) + " " + r.Value) }
今回のソースコード一式は以下にあります。
https://github.com/k-shimoju/golang/tree/master/db