【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