GoでMySQL操作入門
MySQL用意
- Localの環境を汚したくないのでテスト用のDBはDockerで用意する。
- docker-compose でテスト用のデータを事前に入れておく
実際にSELECT文を打ってみる
- 使用するモジュールをgo getで取得
go get github.com/go-sql-driver/mysql
- テスト用コード
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発見
rows.Scanはカラムと一致していないとだめとのこと。
今回用意したテスト用データは以下のような構造をとっているため SELECT * で取得するとカラム数が一致せずエラーが発生する。
`id`, `name`, `register_date`, `update_time`
初歩的なSELECTで躓くのは久しぶりだったのでメモ