gorm とは？ 〜Goのデータ操作を自動化する最強のロボット〜

gorm は、Go 言語でデータベースを簡単に操作できるようにする  **ORM（Object-Relational Mapping）ライブラリ** です。

通常、Go でデータベースを操作するには SQL を直接書かなければなりませんが、gorm を使うと **Go のコードだけで直感的にデータの保存・検索・更新・削除（CRUD）を実行できる**ようになります。

:::note info
要するに、**gormとは、データベースと Go の間を仲介してくれる便利なツール**です。
:::


## gormを例えるなら… 
あなたは **最先端のAI研究所の所長**です 🔬
日々、**大量のデータを管理し、必要に応じてデータを保存・更新・取得** しなければなりません。

そこで、**最強のデータ管理ロボット「gorm」** を開発しました！

gorm は、あなた（Goアプリ）の指示を受け取り、
データベースという広大なデータセンターにアクセスし、
最適なSQLを自動生成＆実行 してくれます。

### **🎩 AI研究所の所長（Goアプリ） vs データ管理ロボット（gorm）**
| **あなたの指示（Goコード）** | **データ管理ロボット `gorm` の仕事（SQL変換）** |
|---------------------|----------------------------------|
| 「新しいユーザーを登録してくれ！」 | `INSERT INTO users (name, email) VALUES ("John", "john@example.com");` |
| 「IDが1のユーザー情報を取ってきて！」 | `SELECT * FROM users WHERE id = 1;` |
| 「ユーザーの年齢を更新してくれ！」 | `UPDATE users SET age = 31 WHERE id = 1;` |
| 「このユーザーを削除して！」 | `DELETE FROM users WHERE id = 1;` |

つまり `gorm` を使うことで、**SQL を書かずに直感的な Go のコードだけでデータベース操作ができる** ようになります！  

## gormのインストール
ロボット `gorm` を起動するために、まずインストールを行いましょう。

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

これで、`gorm` が MySQL データベースと通信できるようになります。


## gorm の基本機能
### 1. データベースと接続
まず、`gorm` にデータベースとの接続情報を設定します。

```go
package main

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

func main() {
	// データベース接続情報（DSN）
	dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"

	// 🤖 `gorm` を起動し、データベースに接続
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatal("データベース接続エラー:", err)
	}

	fmt.Println("✅ gormロボットがデータベースと接続しました！")
}
```

### 2. モデル（データ構造）を定義
データを保存するために、テーブルを Go の構造体で表現します。

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

この `User` 構造体を `gorm` に渡すことで、自動的に `users` テーブルが作成されます。


### 3.データベースにテーブルを作成（マイグレーション）
通常 SQL で `CREATE TABLE` を手書きする必要がありますが、  
`gorm` に頼めば **自動でデータベース構造を作成** してくれます。

```go
db.AutoMigrate(&User{})
```

すると、MySQL に以下の SQL を実行してくれます。

```sql
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    email VARCHAR(255) UNIQUE,
    age INT
);
```

まさに **「SQL自動生成ロボット」** ですね！🤖✨


##  CRUD 操作（基本的なデータ操作）
###  データの追加（CREATE）
新しいユーザーをデータベースに保存したいときは、以下のように書きます。

```go
user := User{Name: "John Doe", Email: "john@example.com", Age: 30}
db.Create(&user)
```

これが SQL に変換されて、自動でデータが保存されます。

```sql
INSERT INTO users (name, email, age) VALUES ("John Doe", "john@example.com", 30);
```

### データの取得（READ）
ID=1 のユーザーを取得したいときは：

```go
var user User
db.First(&user, 1)  // SELECT * FROM users WHERE id = 1 LIMIT 1;
fmt.Println("取得したユーザー:", user)
```

また、すべてのユーザーを取得する場合：

```go
var users []User
db.Find(&users)  // SELECT * FROM users;
fmt.Println("全ユーザー一覧:", users)
```

:::note info
var users []User
db.Find(&users) が全てのユーザーを示します。
:::

### データの更新（UPDATE）
例えば、ユーザーの年齢を更新したい場合：

```go
db.Model(&user).Update("Age", 31)
```

これは、以下の SQL に変換されます。

```sql
UPDATE users SET age = 31 WHERE id = 1;
```


### データの削除（DELETE）
不要になったデータを削除する場合：

```go
db.Delete(&user)
```

SQL に変換すると…

```sql
DELETE FROM users WHERE id = 1;
```


## gormの便利な機能
### 1. WHERE 条件付き検索
特定の条件でデータを取得したい場合も、直感的に書けます。

```go
db.Where("age > ?", 25).Find(&users)
```

これは以下の SQL に変換されます。

```sql
SELECT * FROM users WHERE age > 25;
```

### 2. 1対多リレーション（関連テーブル）
例えば、「ユーザーが複数の投稿を持つ」関係を作りたいとき：

```go
type Post struct {
	ID     uint
	Title  string
	UserID uint
}
type User struct {
	ID    uint
	Name  string
	Posts []Post `gorm:"foreignKey:UserID"`
}
```

:::note info
Posts []Post `gorm:"foreignKey:UserID"
が1(UserID)対多(Posts)リレーションを表します。
:::
 
このコードを書くだけで、`gorm` が **ユーザーと投稿の関係を自動で管理** してくれます。

### 3. トランザクション（複数の処理をまとめる）
データベース処理を **失敗したらすべて取り消す** ようにすることも簡単にできます。

```go
err := db.Transaction(func(tx *gorm.DB) error {
    if err := tx.Create(&user).Error; err != nil {
        return err
    }
    if err := tx.Create(&post).Error; err != nil {
        return err
    }
    return nil
})
if err != nil {
    log.Println("トランザクション失敗:", err)
}
```

## まとめ
✅ **`gorm` はデータベース操作を自動化するロボット🤖！**  
✅ **SQL を手書きせずに、Go のコードだけでデータを操作できる！**  
✅ **マイグレーション（テーブル作成）を自動でやってくれる！**  
✅ **リレーションや検索、トランザクションも簡単に扱える！**