🦁

Go言語 GORM

2024/09/18に公開

はじめに

このページではGORMについて記述します。

GORMとは?

GORMは、Go言語で最も広く使われているORM(Object-Relational Mapping)ライブラリの一つです。データベース操作をより簡単かつ直感的に行うことができ、SQLの知識が少ない場合でも複雑なクエリを組み立てられます。サポートされているデータベースには、MySQL、PostgreSQL、SQLite、SQL Serverなどがあります。

公式ドキュメントはこちら:GORM Documentation

1. GORMのインストール方法

GORMを使用するには、Goプロジェクトにインストールする必要があります。以下のコマンドを実行することで、GORMとそのドライバ(この例ではMySQL)をインストールできます。

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

このコマンドを実行すると、GORMとMySQLドライバがGoモジュールとしてインストールされます。

2. 基本的な使い方

データベース接続

GORMを使用してデータベースに接続するには、まずデータベース接続用のコードを記述します。以下の例では、MySQLデータベースに接続する方法を示します。

package main

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
}

上記のコードでは、gorm.Open関数を使用してデータベースに接続しています。DSN(Data Source Name)は、ユーザー名、パスワード、ホスト、ポート、データベース名などを含む接続文字列です。

モデルの定義

GORMでは、テーブルをGoの構造体(struct)として定義します。以下の例では、Userテーブルを表す構造体を定義しています。

type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"size:255"`
    Age  int
}

テーブルのマイグレーション

定義した構造体を基に、データベースにテーブルを作成することができます。AutoMigrateメソッドを使用すると、GORMは自動的にテーブルを生成または更新します。

db.AutoMigrate(&User{})

レコードの作成

テーブルに新しいレコードを挿入するには、Createメソッドを使用します。

user := User{Name: "John", Age: 25}
db.Create(&user)

レコードの読み取り

テーブルからレコードを取得するには、FirstまたはFindメソッドを使用します。

var user User
db.First(&user, 1) // IDが1のレコードを取得
db.Find(&user, "name = ?", "John") // 名前がJohnのレコードを取得

レコードの更新

レコードを更新するには、SaveまたはUpdatesメソッドを使用します。

db.Model(&user).Update("Age", 30)
db.Model(&user).Updates(User{Name: "Doe", Age: 35})

レコードの削除

レコードを削除するには、Deleteメソッドを使用します。

db.Delete(&user, 1) // IDが1のレコードを削除

3. パフォーマンスの最適化

GORMは、シンプルで使いやすい一方で、パフォーマンスを考慮した使い方が必要です。特に、大規模なデータを扱う際には、N+1問題や複雑なクエリによるパフォーマンス低下を防ぐために注意が必要です。GORMはプレロード(Preloading)やイーガーロード(Eager Loading)などの機能を提供しており、関連データの読み込みを効率化できます。

var users []User
db.Preload("Orders").Find(&users)

この例では、Userと関連するOrdersを一度にロードすることで、データベースへのクエリ回数を削減しています。

4. トランザクションの利用

GORMは、トランザクションをサポートしており、BeginCommitRollbackメソッドを使用してトランザクションを管理します。

tx := db.Begin()
// トランザクション内での操作
if err := tx.Commit().Error; err != nil {
    tx.Rollback()
}

5. カスタムクエリの実行

GORMでは、カスタムSQLクエリを直接実行することも可能です。

db.Exec("UPDATE users SET age = ? WHERE name = ?", 28, "John")

6. バージョン情報

この記事の内容はGORM v1.23.8に基づいています。バージョンによっては仕様や機能が変更される可能性があるため、最新情報は公式ドキュメントを確認してください。

まとめ

GORMはGo言語で使いやすいORMであり、基本的なCRUD操作から高度なクエリやトランザクション管理まで幅広くサポートしています。パフォーマンス最適化の手法も提供しているため、用途に応じた最適な使い方を理解することが重要です。公式ドキュメントを参照しながら、自分のプロジェクトに合った使い方を検討してください。

Discussion