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