devlog

【雑記】GORM でマイグレーションしてみた

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