golang1.5でMySQLを使ってみた
golang 1.5でMySQLを使ってみました。ActiveRecordみたいなORマッパー経由でアクセスするのが良いのだろうか?
使い方
他のスクリプト言語と大体同じような使い方。DB依存しないSQLを使う範囲内であれば、ドライバを入れ替えるだけでデータベースを切り替えることができそう。
ドライバインストール
$ go get github.com/go-sql-driver/mysql
DB Open
dbはコネクションではなく、コネクションプール。
db, err := sql.Open("mysql", USER + ":" + PASSWORD + "@/" + DBNAME) if err != nil { log.Fatal(err) } defer db.Close()
Select
selectはdb.Queryを使い、insert、updateはsql.Execを使う。
rows, err := db.Query("select * from users") defer rows.Close() if err != nil { log.Fatal(err) }
Select(Prepared Statement)
セキュリティ的には、外部から入力した値をSQLに使う場合、こちらを使う必要がある。
query := "SELECT * FROM users WHERE name=?" rows, err := db.Query(query, "user1") defer rows.Close() if err != nil { log.Fatal(err) }
データ一覧取得
for rows.Next() { var id int var name string var email string if err := rows.Scan(&id, &name, &email); err != nil { log.Fatal("scan err: %v", err) } fmt.Println(id, name, email) }
ソース例
package main import ( "database/sql" _ "github.com/go-sql-driver/mysql" "fmt" "log" ) const USER = "gouser" const PASSWORD = "golang" const DBNAME = "gotest" func main() { db, err := sql.Open("mysql", USER + ":" + PASSWORD + "@/" + DBNAME) if err != nil { log.Fatal(err) } defer db.Close() // prepared statement(placeholder) query := "SELECT * FROM users WHERE name=?" rows, err := db.Query(query, "user1") defer rows.Close() if err != nil { log.Fatal(err) } for rows.Next() { var id int var name string var email string if err := rows.Scan(&id, &name, &email); err != nil { log.Fatal("scan err: %v", err) } fmt.Println(id, name, email) } }