2023-09-11
GORM 初心者です。マイグレーションをしてみました。
作業内容をメモに残します。
バージョン
- mysql 8.0.23
- go 1.21.0
- gorm 1.25.4
DB は PlanetScale という DBaaS を用いてます。MySQL 8 系です。
実体は AWS の ap-northeast-1 にあります。
ORM として GORM を用います。
go get gorm.io/gorm go get gorm.io/driver/mysql
テーブル構造
DB のテーブル構造です。structにタグをつけて型を定義します。
type Note struct { ID uint `gorm:"primaryKey"` Name string `gorm:"type:varchar(255)"` Content string `gorm:"type:text"` Comment string `gorm:"type:text"` CreatedAt time.Time `gorm:"type:timestamp;not null;default:current_timestamp"` UpdatedAt time.Time `gorm:"type:timestamp;not null;default:current_timestamp on update current_timestamp"` }
CreatedAt, UpdatedAt は timestamp 型にしました。
デフォルト値として CURRENT_TIMESTAMP を指定しているので、MySQLが自動で日時を入れてくれます。
マイグレーション
GORM の AutoMigrate でマイグレーションします。
package main import ( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" ) type Note struct { ID uint `gorm:"primaryKey"` Name string `gorm:"type:varchar(255)"` Content string `gorm:"type:text"` Comment string `gorm:"type:text"` CreatedAt time.Time `gorm:"type:timestamp;not null;default:current_timestamp"` UpdatedAt time.Time `gorm:"type:timestamp;not null;default:current_timestamp on update current_timestamp"` } func main() { dsn := "" // 接続情報 db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { fmt.Printf("failed %s", err) return } // マイグレーション if err := db.AutoMigrate(&Note{}); err != nil { fmt.Printf("failed %s", err) } }
AutoMigrate は便利なのですが、マイグレーションスクリプトとしては少々曖昧です。 動きを予想しづらく。。
そのため実際に反映する際は db.Migrator().CreateTable() など別のメソッドを用いた方が良いと思います。
終わりに
PlanetScale ですが、今回初めて触れてみました。なかなか印象良いです。
ローコード的な機能不足 (融通の効かなさ) を想像していたのですが、
むしろ branch といった独自の機能があり、ベースラインを下支えしてくれます。
作成日
2023-09-11
更新日
2023-09-11