Revel の MySQL プラグインを書いてみる

Revel から MyMySQL を使って MySQL にアクセスすることができるようにしたかったので書いた.

とりあえず下記のようなコードをどこかに置いておけばいいっぽい. プラグインって構成上どこにおけばいいんだろう.

https://gist.github.com/nise-nabe/5234154

import (
    "database/sql"
    "github.com/robfig/revel"
    _ "github.com/ziutek/mymysql/godrv"
)

var (
    db *sql.DB
)

type MySQLPlugin struct {
    revel.EmptyPlugin
}

func (p MySQLPlugin) OnAppStart() {
    host, _ := revel.Config.String("db.host")
    port, _ := revel.Config.String("db.port")
    dbname, _ := revel.Config.String("db.name")
    user, _ := revel.Config.String("db.user")
    pass, _ := revel.Config.String("db.pass")

    var err error
    db, err = sql.Open("mymysql", "tcp:"+host+":"+port+"*"+dbname+"/"+user+"/"+pass)
    if err != nil {
        panic(err)
    }
}

func (p MySQLPlugin) BeforeRequest(c *revel.Controller) {
    txn, err := db.Begin()
    if err != nil {
        panic(err)
    }
    c.Txn = txn
}

func (p MySQLPlugin) AfterRequest(c *revel.Controller) {
    c.Txn.Commit()
    c.Txn = nil
}

func (p MySQLPlugin) OnException(c *revel.Controller, err interface{}) {
    if c.Txn != nil {
        c.Txn.Rollback()
    }
}

func init() {
    revel.RegisterPlugin(MySQLPlugin{})
}

conf/app.conf に下記のような記述を追加.

db.host = host
db.port = port
db.name = databasename
db.user = username
db.pass = password

あとは Go 言語の database/sql パッケージの使い方でアクセスすればいい.