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)
}
}