mutao.net

いわゆる雑記。

GoでMySQL操作入門

MySQL用意

  • Localの環境を汚したくないのでテスト用のDBはDockerで用意する。
  • docker-compose でテスト用のデータを事前に入れておく

github.com

実際にSELECT文を打ってみる

  • 使用するモジュールをgo getで取得
go get github.com/go-sql-driver/mysql

github.com

  • テスト用コード
package main

import (
    "fmt"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

type User struct {
    ID   int
    Name string
}
func main() {
    db, err := sql.Open("mysql", "root:rootpassword@tcp(127.0.0.1:3306)/test")
    if err != nil {
        panic(err.Error())
        fmt.Print("connect failed.")
    }
    defer db.Close()
    fmt.Println("connect complete!")
 
    rows, err := db.Query("SELECT * FROM users")
    if err != nil {
        panic(err.Error())
        fmt.Println("select error occuerd.")
    }
    defer rows.Close()

    for rows.Next() {
        var user User
        err := rows.Scan(&user.ID, &user.Name)
        if err != nil {
            panic(err.Error())
        }
        fmt.Println(user.ID, user.Name)
    }
 
    err = rows.Err()
    if err != nil {
        panic(err.Error())
    }
}
  • エラー発生。
panic: sql: expected 4 destination arguments in Scan, not 2

goroutine 1 [running]:
main.main()
        go-learning/lession.go:51 +0x3f0
exit status 2
  • ぐぐってみると素晴らしいPOST発見

qiita.com

rows.Scanはカラムと一致していないとだめとのこと。

今回用意したテスト用データは以下のような構造をとっているため SELECT * で取得するとカラム数が一致せずエラーが発生する。

`id`, `name`, `register_date`, `update_time`

初歩的なSELECTで躓くのは久しぶりだったのでメモ