非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【Go言語】MySQLに接続する方法(項目を動的に取得する場合)

   

前回、Go言語からMySQLに接続する方法について書きましたが、この方法だと呼び出す項目名が固定になってしまい扱いづらい点が問題です。

そこで、どんなSELECT文が来ても値を読み込めるようにソースを修正しました。

package main

import (
  "database/sql"
  "fmt"

  _ "github.com/go-sql-driver/mysql"
)

func main() {
  // データベースのハンドルを取得する
  db, err := sql.Open("mysql", "user:password@(192.168.10.102:3306)/dbname")
  if err != nil {
    fmt.Println(err.Error())
  }
  defer db.Close()

  rows, err := db.Query("SELECT * FROM bookmark")
  if err != nil {
    fmt.Println(err.Error())
  }
  defer rows.Close()

  //項目名取得
  columns, err := rows.Columns()

  //makeで項目数に応じてスライスを定義
  values := make([]interface{}, len(columns))
  for i := range columns {
    var value interface{}
    values[i] = &value
  }

  //データの取得
  for rows.Next() {
    //スライスに値を入力
    err := rows.Scan(values...)
    if err != nil {
      fmt.Println(err.Error())
    }
    //型に応じて処理([]byte型になっているはず)
    for i, column := range columns {
      switch v := (*(values[i].(*interface{}))).(type) {
        case nil:
          fmt.Printf("%s: NULL ", column)
        case []byte:
          fmt.Printf("%s: %s ", column, string(v))
        default:
          fmt.Printf("%s: %v ", column, v)
      }
    }
    println()
  }
}
 

 

スポンサーリンク

 - Go言語