GoでMySQLのデータを取得する

用意するテーブルはこんな感じ

id name
1 Taro
1 Jiro

コード

一応ここに同じコードがある https://github.com/nyo3q1/golang_simple_api

package main

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

type People struct {
    id int64
    name string
}

type Peoples []People

func GetPeoples() Peoples{
    db, err := sql.Open("mysql", "docker:docker@tcp(db)/test_database")
    if err != nil {
        log.Fatal("db error.")
    }
 
    rows, err := db.Query("select * from people")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    var peoples Peoples
    for rows.Next() {
        people := People{}
        if err := rows.Scan(&people.id, &people.name); err != nil {
            log.Fatal(err)
        }

        peoples = append(peoples, people)
    }
    defer db.Close()

    return peoples
}

簡単な説明

説明する必要もないけど記事を書く上でコードだけというのも味気ないので...

この行で

  • MySQLに接続
  • ユーザ、パスワードが、docker:docker
  • 接続先がdbと言うホスト名(IPアドレスでもOK)
  • データベース名は test_database
sql.Open("mysql", "docker:docker@tcp(db)/test_database")

個人的に面白いなとおもったのが取得したデータを変数に格納するところ。

取得したカラムに沿っていかないとダメ。

取得するカラムを意識的に記述できて、レイテンシも向上しそうで好き。

rows.Scan(&people.id, &people.name)

ちなみにpeoplesをreturnするようにしているけど受け取り元ではこうやって書く

peoples := GetPeoples()