· Genmai golang Go言語 MySQL

Genmaiを使ってみた。 #golang

  • このエントリーをはてなブックマークに追加

ORM for golangのGenmaiを使って、MySQLにアクセスしてみた。

使い方は以下の様な感じです。

テーブルを定義します。

// ユーザーテーブル
type User struct {
    Id    int `db:"pk"`
    Name  string
    genmai.TimeStamp
}

データベースを作る時に、&genmai.MySQLDialect{}と、DSNを指定する。

database, err := genmai.New(&genmai.MySQLDialect{}, dataSourceName)
// userテーブルがなければ、作成する
if err := database.CreateTableIfNotExists(&User{}); err != nil {
    panic(err)
}
// 挿入したいデータ
data := []User{
        {Name:"Aさん"},
        {Name:"Bさん"},
        {Name:"Cさん"},
    }
// dataを挿入
if _, err := database.Insert(data); err!= nil{
    panic(err)
}
// 取得したい空のデータを用意
var users []User
// データを取得
if err:= db.Select(&users); err != nil{
    panic(err)
}

これを実行すると、

テーブル作成できた!

table_struct

データの挿入もOK!

table_content

あれ?データの取得が下記のエラーでコケるなぁ。

unsupported driver -> Scan pair: []uint8 -> *time.Time

time.Timeを使ってる箇所は、User構造体のgenmai.TimeStampのところだけです。ちなみにgenmai.TimeStampがどうなっているかというと、

// TimeStamp is fields for timestamps that commonly used.
type TimeStamp struct {
    // Time of creation. This field will be set automatically by BeforeInsert.
    CreatedAt time.Time `json:"created_at"`

    // Time of update. This field will be set by BeforeInsert or BeforeUpdate.
    UpdatedAt time.Time `json:"updated_at"`
}

となっています。

また、MySQLのドライバに、github.com/go-sql-driver/mysqlを使っています。

うん、ココらへんが怪しいですね。とおもって調べていたら、github.com/go-sql-driver/mysqltime.Timeはサポートしているのですが、[]byteからtime.Timeへの変換がデフォルトではできません。これを可能にするには、DSNのパラメータに、parseTime=trueをつける必要があります。というのが、下記に書いてあります。

https://github.com/go-sql-driver/mysql#timetime-support

以上です。

  • このエントリーをはてなブックマークに追加
  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket