万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

golangでgorpの使い方

Golang Cafe #41 まとめ gorpを試す。 - taknb2nchのメモ

を見たが、すべてのコードがなかった。

importを追加した。 sqlite3のファイル名はfoo.dbが出来る。 もともとあれば一旦削除される。

package main

import (
    "time"
    "fmt"
    "os"
    "math/rand"
    "math/big"
    "database/sql"
    _ "github.com/mattn/go-sqlite3"
    "github.com/coopernurse/gorp"
)

type Person struct {
    Id int32
    Name sql.NullString
    Age sql.NullInt64
    Sex sql.NullBool
    Height sql.NullFloat64
    Birthday time.Time
    BString []byte
    BBigInt []byte
}

func main() {
    os.Remove("./foo.db")
    db, err := sql.Open("sqlite3", "./foo.db")
    if err != nil {
        panic(err.Error())
    }

    dbmap := gorp.DbMap{Db: db, Dialect: gorp.SqliteDialect{}}
    t := dbmap.AddTableWithName(Person{}, "person").SetKeys(true, "Id")
    t.ColMap("Id").Rename("id")
    t.ColMap("Name").Rename("name")
    t.ColMap("Age").Rename("age")
    t.ColMap("Sex").Rename("sex")
    t.ColMap("Height").Rename("height")
    t.ColMap("Birthday").Rename("birthday")
    t.ColMap("BString").Rename("bstring")
    t.ColMap("BBigInt").Rename("bbigint")
    dbmap.DropTables()
    err = dbmap.CreateTables()
    if err != nil {
        panic(err.Error())
    }

    tx, _ := dbmap.Begin()
    for i := 0; i < 100; i++ {

        p := Person{}
        if rand.Float32() > 0.5 {
            p.Name.Scan(fmt.Sprintf("mattn%03d", i))
        }

        if rand.Float32() > 0.5 {
            p.Age.Scan(i)
        }

        if rand.Float32() > 0.5 {
            p.Sex.Scan(rand.Float32() > 0.5)
        }

        if rand.Float32() > 0.5 {
            p.Height.Scan(rand.Float32())
        }

        if rand.Float32() > 0.5 {
            p.Birthday = time.Now()
        }

        if rand.Float32() > 0.5 {
            p.BString = []byte(fmt.Sprintf("mattn%03d", i))
        }

        if rand.Float32() > 0.5 {
            p.BBigInt = big.NewInt(int64(i * 10000)).Bytes()
        }

        err = tx.Insert(&p)
        if err != nil {
            tx.Rollback()
            panic(err.Error())
        }
    }
    tx.Commit()

    list, _ := dbmap.Select(&Person{}, "select * from person")
    for _, l := range list {
        p := l.(*Person)

        var (
            bstring string
            bbigint big.Int
        )

        if p.BString != nil {
            bstring = string(p.BString)
        }

        if p.BBigInt != nil {
            bbigint = big.Int{}
            bbigint.SetBytes(p.BBigInt)
        }

        fmt.Printf("%d, %s, %d, %t, %f, %v, %d\n", p.Id, p.Name, p.Age, p.Sex, p.Height, bstring, bbigint)
    }
}
go run main.go