Help us understand the problem. What is going on with this article?

GoでMySQLに接続する

More than 3 years have passed since last update.

Go言語にはデフォルトでSQLやSQLライクなデータベースに接続するための
インターフェースがデフォルトで用意されている。

http://golang.org/pkg/database/sql/

それに各DB用のドライバーを追加して、データベースに接続する

go-sql-driver/mysql のインストール

$ go get github.com/go-sql-driver/mysql

コード

main.go
package main

import (
  "database/sql"
  "fmt"

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

func main() {
  db, err := sql.Open("mysql", "root:@/my_database")
  if err != nil {
    panic(err.Error())
  }
  defer db.Close() // 関数がリターンする直前に呼び出される

  rows, err := db.Query("SELECT * FROM users") // 
  if err != nil {
    panic(err.Error())
  }

  columns, err := rows.Columns() // カラム名を取得
  if err != nil {
    panic(err.Error())
  }

  values := make([]sql.RawBytes, len(columns))

  //  rows.Scan は引数に `[]interface{}`が必要.

  scanArgs := make([]interface{}, len(values))
  for i := range values {
    scanArgs[i] = &values[i]
  }

  for rows.Next() {
    err = rows.Scan(scanArgs...)
    if err != nil {
      panic(err.Error())
    }

    var value string
    for i, col := range values {
      // Here we can check if the value is nil (NULL value)
      if col == nil {
        value = "NULL"
      } else {
        value = string(col)
      }
      fmt.Println(columns[i], ": ", value)
    }
    fmt.Println("-----------------------------------")
  }
}

メモ

import の _

importの書式については
http://qiita.com/taizo/items/56f8639260eb2a0fa999 参照

sqlドライバ

https://code.google.com/p/go-wiki/wiki/SQLDrivers にリンクがある。

  db, err := sql.Open("mysql", "root:@/my_database")

[]interface{} の準備

本来ならば、

sliceData := sliceFunc() 
var scanArgs []interface{} = values

みたいなのを用意したいが、型がそもそも違うのでこれだとエラーになる。
なので、一旦、空のinterfaceを持つスライスを
sliceDataと同じ数だけ作ってから、一つ一つ埋めていく。

  sliceData := sliceFunc()
  scanArgs := make([]interface{}, len(sliceData))
  for i := range sliceData {
    scanArgs[i] = sliceData[i]
  }

  fmt.Println(scanArgs)

詳しくは http://code.google.com/p/go-wiki/wiki/InterfaceSlice 参照

ちなみにスライスじゃなければ代入できる

var num int = 3
var a interface{} = num

fmt.Println(a) // 3
taizo
ruby,javascript,go とかウェブサービスに関わる小さな話を書いていきます。 最近はGoばかりやってます。基本はメモ。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away