前回DB検討してMySQLを使いましたが、パフォーマンスより楽さが欲しくなってSQLiteを使いたくなりました。
SQLもORMライブラリを使ってひたすら楽してDBを使ってみます。
SQLite(Windows)の準備
GOで使う分には必要ないけど使うかもしれないので一応入れる。
ダウンロードページからWindows用の下2つをダウンロードして中身を1つのフォルダに入れます。
あとはPathを通せばコマンドで使えるようになります。
Goの準備
DBのドライバは公式のものがないのでどこからかとってくる必要があります。
wikiにドライバ一覧があるのでそこから選択。
SQLiteの場合は4つありますがテストに合格していてstar数も多いものを使います。
https://github.com/mattn/go-sqlite3
1 |
go get github.com/mattn/go-sqlite3 |
SQL部分はデフォルトの”database/sql”はちょっと不便なのでライブラリを使いたい。
少し調べた感じだとgormがダントツで人気に見える。次点でsqlx。
1 |
go get github.com/jinzhu/gorm |
使い方などは公式ドキュメントなどを参考にする。
日本語: http://gorm.io/ja_JP/docs/
GoDoc: https://godoc.org/github.com/jinzhu/gorm
Goで動かす
サンプルコードをいじりながら色々試してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/mattn/go-sqlite3" ) type Product struct { Code string Price uint } func main() { db, err := gorm.Open("sqlite3", "test.db") if err != nil { panic("failed to connect database") } defer db.Close() var product Product var products []Product // Migrate the schema db.AutoMigrate(&Product{}) // Create db.Create(&Product{Code: "L1212", Price: 1000}) db.Create(&Product{Code: "R2525", Price: 1192}) p := Product{Code: "K9999", Price: 10} db.Create(&p) db.Create(&Product{Code: "R2525", Price: 1192}) //多重登録可 // - 多重登録を防ぐ if db.NewRecord(p) { db.Create(&p) /* 今回のコードではこれはうまく動かない。 `gorm:"primary_key"`を指定してもダメ。 gorm.Modelを注入すると想定通りに動いた。 */ } // Read // - 全取得 db.Find(&products) // SELECT * FROM Product; fmt.Println(products)//[{L1212 1000} {R2525 1192} {K9999 10} {R2525 1192}] // - integer型プライマリキーの指定はこれでできる db.First(&product, 1) //SELECT * FROM users WHERE id = 1; fmt.Println(product) //{ 0} (該当なしのため空の構造体) // - ORDERBYして最初の1つ db.First(&product) // SELECT * FROM users ORDER BY id LIMIT 1; fmt.Println(product) //{L1212 1000} // - where句で指定して最初の1つ db.First(&product, "code = ?", "R2525") fmt.Println(product) //{R2525 1192} // Update // - 全レコードのPriceを変更 db.Model(&product).Update("Price", 2000) db.Find(&products) // SELECT * FROM Product; fmt.Println(products) //[{L1212 2000} {R2525 2000} {K9999 2000} {R2525 2000}] // - 特定レコードの変更 db.Model(&product).Where("code = ?", "R2525").Update("Price", 3000) db.Find(&products) fmt.Println(products) //[{L1212 2000} {R2525 3000} {K9999 2000} {R2525 3000}] // Delete db.Delete(&products) } |
慣れるまで構造体にはgorm.Model
を入れると楽そう(PIDやらなんやら自動で入る)。
SQLを全く書かなくても大抵のことはできそうです。
使いやすくなったような覚えることが増えたような。
同様の構成のプロジェクトを探して参考にしたい。
今回はtest.dbを指定してますが実行場所を読み込みます(なければ作成される)。
go run aaa/bbb/main.go
などしてもコマンド実行場所にできるので注意する。