0Pricing
Go Academy · レッスン

モデルとAutoMigrate

スキーマを定義してマイグレーションします

「モデルとAutoMigrate」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

GORMとは

GORM はGoで最も広く使われているORMです。Goの構造体をデータベースのテーブルに対応付けるため、生のSQLではなくオブジェクトを使って処理できます。PostgreSQL、MySQL、SQLiteなどをサポートしています。

  • 構造体とテーブルの対応付け
  • 自動マイグレーション
  • アソシエーションとフック

モデルの定義

モデルはGoの構造体です。エクスポートされた各フィールドがカラムになります。gorm.Model を埋め込むと、ID、CreatedAt、UpdatedAt、DeletedAtのフィールドが追加されます。

type User struct {
    gorm.Model
    Name  string
    Email string
    Age   int
}

フィールドタグ

構造体タグでカラムをカスタマイズできます。gorm タグを使って、サイズ、一意性、インデックス、デフォルト値を設定できます。タグはフィールド型の後ろにバッククォートで記述します。たとえば gorm:"uniqueIndex;size:255" のように書きます。

type User struct {
    // ID    uint    tag: gorm:"primaryKey"
    // Email string  tag: gorm:"uniqueIndex;size:255"
    // Name  string  tag: gorm:"not null"
    ID    uint
    Email string
    Name  string
}

命名規則

GORMはデフォルトで複数形化とsnake_case変換を行います。User 構造体は users テーブルに対応し、CreatedAt フィールドは created_at に対応します。これらは上書きできます。

GORMでの接続開始

gorm.Open はデータベース用のダイアレクトを受け取り、*gorm.DB を返します。このハンドルがコネクションプールをラップします。

db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
    log.Fatal(err)
}

AutoMigrate

AutoMigrate は、構造体に合わせてテーブル、不足しているカラム、インデックスを作成します。追加的に処理するため、カラムの削除や型の破壊的な変更は行いません。

db.AutoMigrate(&User{}, &Product{})

AutoMigrateで行われないこと

AutoMigrateは、データ損失を避けるため、使われていないカラムを削除したり、型を小さくしたりすることはありません。名前の変更、削除、型の変更には、明示的なマイグレーションツールが必要です。

実行可能なモデル対応付けのシミュレーション

GORMには実際のデータベースドライバーが必要です。そのため、この実行可能な例では、AutoMigrateが行うsnake_caseのテーブル名とカラム名への対応付けをシミュレートします。

package main

import (
    "fmt"
    "strings"
)

func toSnake(s string) string {
    var b strings.Builder
    for i, r := range s {
        if i > 0 && r >= 65 && r <= 90 {
            b.WriteByte(95)
        }
        if r >= 65 && r <= 90 {
            r = r + 32
        }
        b.WriteRune(r)
    }
    return b.String()
}

func main() {
    model := "User"
    fields := []string{"ID", "Name", "CreatedAt"}
    fmt.Println("table:", toSnake(model)+"s")
    for _, f := range fields {
        fmt.Println("column:", toSnake(f))
    }
}

DeletedAtフィールド

モデルに gorm.Model を埋め込むか、gorm.DeletedAt フィールドを持たせると、GORMでソフトデリートが有効になります。削除された行にはタイムスタンプが設定され、実際に削除される代わりにクエリから非表示になります。

カスタムテーブル名

モデルに TableName メソッドを実装すると、デフォルト値を上書きできます。スキーマでGORMの規則に合わない名前を使う場合に便利です。

func (User) TableName() string {
    return "app_users"
}

外部パッケージに関する注意

GORMとそのダイアレクトは標準ライブラリの外部にあるため、go get gorm.io/gorm と gorm.io/driver/postgres のようなドライバーが必要です。ここで示すGORMのコード例は説明用です。

理解度チェック

モデルに関する知識を確認しましょう。

まとめ

モデルとAutoMigrateについて学びました。

  • 構造体はテーブルに対応し、gorm.ModelはIDとタイムスタンプを追加します
  • タグで主キー、インデックス、制約を設定します
  • デフォルトの命名は複数形のsnake_caseです
  • AutoMigrateは追加的に処理し、破壊的な変更は行いません
  • DeletedAtによってソフトデリートが有効になります

よくある質問

「モデルとAutoMigrate」レッスンは無料ですか?

はい。「モデルとAutoMigrate」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「モデルとAutoMigrate」で何を学びますか?

スキーマを定義してマイグレーションします ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「モデルとAutoMigrate」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. モデルとAutoMigrate
  2. CRUD操作
  3. 関連付け
  4. フックとスコープ
← Go Academyに戻る