GormでDB(MySQL)を操作してみた
事前準備
$ cd $GOPATH/src $ mkdir gorm-test $ cd gorm-test $ touch gorm.go
gormパッケージをインストール
go get github.com/jinzhu/gorm
実装
gorm.goを何かしらのエディタで開き、以下のように記述
package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) type ImplDB struct { DB *gorm.DB } type User struct { UserID uint `gorm:"primary_key;auto_increment:false"` UserName string `gorm:"size:255"` } func (i *ImplDB) initDB() { var err error // USER、PASS、DBNMEなどは各自設定してある値を記述 DBMS := "mysql" USER := "root" PASS := "password" PROTOCOL := "tcp(localhost:3306)" DBNAME := "sample" CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=True&loc=Local" i.DB, err = gorm.Open(DBMS, CONNECT) if err != nil { panic("DBへの接続に失敗しました") } } // スキーマのマイグレーション func (i *ImplDB) initMigration() { i.DB.AutoMigrate(&User{}) } func main() { i := &ImplDB{} // DBに接続 i.initDB() // main関数が終わる際にDBの接続を切る defer i.DB.Close() // スキーマのマイグレーション i.initMigration() insertUser := User{} user := User{} user2 := User{} insertUser.UserID = 1 insertUser.UserName = "hoge" // 作成 // INSERT INTO users(user_id,user_name) VALUES(1,'hoge'); i.DB.Create(&insertUser) // 取得 // SELECT * FROM users WHERE user_id = 1; i.DB.Find(&user, "user_id = ?", 1) fmt.Println("取得したuserの値は", user) // 更新 // UPDATE users SET user_name = 'fuga' WHERE user_id = 1 and user_name = 'hoge'; i.DB.Model(&user).Update("user_name", "fuga") fmt.Println("更新後のuser:", user) // 削除 // DELETE FROM users WHERE user_id = 1 and user_name = 'hoge'; i.DB.Delete(&user) if err := i.DB.Find(&user2, "user_id = ?", 1).Error; err != nil { // エラーハンドリング fmt.Println("存在しませんでした") } else { fmt.Println("取得したuserの値は", user2) } }
// スキーマのマイグレーション func (i *ImplDB) initMigration() { i.DB.AutoMigrate(&User{}) }
ここではUserの構造体とDBのスキーマを比較して、不足しているカラムなどを追加。
またusersテーブルがない場合はusersテーブルを作成。
AutoMigrate()メソッドの引数にはアドレスを渡す。他のメソッド( Create()やFirst() など )も値ではなくアドレスを渡すのでそこは注意したい。
そして実行
$ go run hello.go 取得したuserの値は {1 hoge} 更新後のuser: {1 fuga} 存在しませんでした
で簡単にDB操作を行うことが出来た。
ちなみに上記の操作を一個の処理単位として行いたい場合はTransaction
というものを使えば良いらしい。
gorm.io
以上、Gormの紹介でした。