LoginSignup
50
29

More than 5 years have passed since last update.

Goでsqlxを使う

Last updated at Posted at 2018-12-10

Goのデータベース系ライブラリ sqlxとは

GoでDB接続に使う標準パッケージdatabase/sqlに拡張機能を提供するライブラリです。
DBから引っ張ってきたデータを構造体、マップ、スライスに当てはめてくれます。

何が良いのか

通常であればデータベースから引っ張ってきたデータをカラムごとに一個一個Scan(型変換)しなければなりませんが、そこを勝手にやってくれるのでコード記述量を少なくできます。カラム数が多いレコードを全件引っ張ってくる時なんかは、とても便利です。
これ以外にも用途があるのかもしれませんが、今の所わかったこと。

使い方

使わないと分からないと思うので具体例で見てみます。
今回はMysqlにあらかじめ用意しておいた、id, name, ageカラム があるだけのシンプルなデータベースに接続してみます。あらかじめ2件のレコードを挿入してあります。
スクリーンショット 2018-12-10 21.52.01.png

まずはライブラリを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/

50
29
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
50
29