Edited at

GoでMySQLに接続する

More than 1 year has 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