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

参考情報