Go言語にはデフォルトでSQLや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