##Goのデータベース系ライブラリ sqlxとは
GoでDB接続に使う標準パッケージdatabase/sqlに拡張機能を提供するライブラリです。
DBから引っ張ってきたデータを構造体、マップ、スライスに当てはめてくれます。
##何が良いのか
通常であればデータベースから引っ張ってきたデータをカラムごとに一個一個Scan(型変換)しなければなりませんが、そこを勝手にやってくれるのでコード記述量を少なくできます。カラム数が多いレコードを全件引っ張ってくる時なんかは、とても便利です。
これ以外にも用途があるのかもしれませんが、今の所わかったこと。
##使い方
使わないと分からないと思うので具体例で見てみます。
今回はMysqlにあらかじめ用意しておいた、id, name, ageカラム があるだけのシンプルなデータベースに接続してみます。あらかじめ2件のレコードを挿入してあります。
まずはライブラリをgo getしておきます。
https://github.com/jmoiron/sqlx
go get github.com/jmoiron/sqlx
続いて、引っ張ってきたデータを構造体に当てはめる、もっともシンプルなコードの記述例です。
package main
import (
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
//引っ張ってきたデータを当てはめる構造体を用意。
//その際、バッククオート(`)で、どのカラムと紐づけるのかを明示する。
type User struct {
ID int `db:"id"`
Name string `db:"name"`
Age int `db:"age"`
}
type Userlist []User
func main() {
//Userデータ一件一件を格納する配列Userlistを、Userlist型で用意
var userlist Userlist
//Mysqlに接続。sql.Openの代わりにsqlx.Openを使う。
//ドライバ名、データソース名を引数に渡す
db, err := sqlx.Open("mysql", "root@/gosample")
if err != nil {
log.Fatal(err)
}
//SELECTを実行。db.Queryの代わりにdb.Queryxを使う。
rows, err := db.Queryx("SELECT * FROM users")
if err != nil {
log.Fatal(err)
}
var user User
for rows.Next() {
//rows.Scanの代わりにrows.StructScanを使う
err := rows.StructScan(&user)
if err != nil {
log.Fatal(err)
}
userlist = append(userlist, user)
}
fmt.Println(userlist)
//[{1 yamada 25} {2 suzuki 28}]
}
通常のsqlパッケージであれば、rows.Nextのところで「&user.ID,$user.Name...」などとカラム の分だけ引数を書かなければなりませんが、sqlxを使うと、当てはめたい構造体の構成まで見に行ってくれるので 、ここでは「&user」と書くだけ済んでいます。
今回は3つしかカラム がないので全部書いてもそれほど面倒ではありませんが、カラム数が多いレコードの場合はとても便利です。
##参考
公式
https://github.com/jmoiron/sqlx
http://jmoiron.github.io/sqlx/