【Go言語】WebフレームワークBeego、PostgreSQLを使ってテーブルをマイグレーションする

# ゴール
このようにPostgreSQLにTodoテーブルをマイグレーションする方法です。

![BeegoのTodoテーブルを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/e077a61e-6125-b89a-d4f3-a00ad53a41be.png)

# プロジェクトのディレクトリ構造

```
My-First-Beego-Project
├─ conf
│  └─ app.conf
├─ controllers
│  └─ default.go
├─ models
│  └─ todo.go
├─ routers
│  └─ router.go
├─ static
│  ├─ css
│  ├─ img
│  ├─ js
│  │  ├─ form.js
│  │  └─ reload.min.js
│  └─ lib
│     └─ boostrap
│        ├─ css
│        │  ├─ bootstrap-grid.min.css
│        │  └─ bootstrap.min.css
│        ├─ js
│        │  ├─ bootstrap-bundle.min.js
│        │  └─ bootstrap.min.js
│        └─ jquery
│           └─ jquery.js
├─ views
│     ├─ index.tpl
│     ├─ subIndex.tpl
│     └─ thirdIndex.tpl
└─ main.go
```

# モジュールのインストール
## `beego orm`のインストール
`cd`コマンドでプロジェクトに入って、下記のコマンドでインストールしましょう。

https://pkg.go.dev/github.com/beego/beego/v2/client/orm#section-readme

```
go get github.com/beego/beego/v2/client/orm
```

## `pq`のインストール
PostgreSQLと接続するモジュールをインストールしましょう。

https://github.com/lib/pq

```
go get github.com/lib/pq
```

# `config`ファイルの編集
PostgreSQLの接続情報を下記のように追加しておきます。

```conf/app.conf
appname = my-first-beego-project
httpport = 8080
runmode = dev

db_driver = postgres
db_user = postgres
db_password = postgres
db_host = localhost
db_port = 5432
db_name = beegoDb
```

# `models`の編集
`todo`テーブルを作るため、``Modelクラスを下記のように編集します。

```models/todo.go
package models // ここでパッケージ名を指定

import (
	"github.com/beego/beego/v2/client/orm"
	_ "github.com/lib/pq" // PostgreSQL ドライバをインポート
)

type Todo struct {
	Id          int64  `orm:"auto"`
	Title       string `orm:"size(128)"`
	Description string `orm:"size(255)"`
	Completed   bool   `orm:"default(false)"`
}

func init() {
	// PostgreSQLのドライバ登録
	orm.RegisterDriver("postgres", orm.DRPostgres)

	// データベース接続設定
	orm.RegisterDataBase("default", "postgres", "user=postgres password=postgres host=localhost port=5432 dbname=beegoDb sslmode=disable")

	// モデルの登録
	orm.RegisterModel(new(Todo))

	// テーブルが存在しない場合に作成（強制的にマイグレーション）
	orm.RunSyncdb("default", false, true)
}

```

# `main.go`の編集
実行ファイル`main.go`に編集したモデルクラスをインポートしておきます。

```main.go
package main

import (
	_ "my-first-beego-project/models" // modelsパッケージをインポート
	_ "my-first-beego-project/routers"

	"github.com/astaxie/beego"
)

func main() {
	beego.Run()
}

```

# マイグレーションする

いよいよモデルクラスをPostgreSQLに反映させます。

```
bee run
```

このようにコマンドパレットに表示されたらOKです。

![Beegoマイグレーション完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/ad64cc49-9b31-53b4-8e20-ffd7528916dc.png)


# トラブルシューティング

## `bee run`コマンドを入力しても`module依存関係エラー`が表示される。

```
0003 Initializing watcher...
..\..\go\pkg\mod\github.com\astaxie\beego@v1.12.3\context\output.go:34:2: missing go.sum entry for module providing package gopkg.in/yaml.v2 (imported by github.com/astaxie/beego/context); to add:
        go get github.com/astaxie/beego/context@v1.12.3
..\..\go\pkg\mod\github.com\astaxie\beego@v1.12.3\admin.go:28:2: missing go.sum entry for module providing package github.com/prometheus/client_golang/prometheus/promhttp (imported by github.com/astaxie/beego); to add:
        go get github.com/astaxie/beego@v1.12.3
..\..\go\pkg\mod\github.com\astaxie\beego@v1.12.3\app.go:33:2: missing go.sum entry for module providing package golang.org/x/crypto/acme/autocert (imported by github.com/astaxie/beego); to add:
        go get github.com/astaxie/beego@v1.12.3
2025/02/07 23:56:03 ERROR    ▶ 0004 Failed to build the application: ..\..\go\pkg\mod\github.com\astaxie\beego@v1.12.3\context\output.go:34:2: missing go.sum entry for module providing package gopkg.in/yaml.v2 (imported by github.com/astaxie/beego/context); to add:
        go get github.com/astaxie/beego/context@v1.12.3
..\..\go\pkg\mod\github.com\astaxie\beego@v1.12.3\admin.go:28:2: missing go.sum entry for module providing package github.com/prometheus/client_golang/prometheus/promhttp (imported by github.com/astaxie/beego); to add:
        go get github.com/astaxie/beego@v1.12.3
..\..\go\pkg\mod\github.com\astaxie\beego@v1.12.3\app.go:33:2: missing go.sum entry for module providing package golang.org/x/crypto/acme/autocert (imported by github.com/astaxie/beego); to add:
        go get github.com/astaxie/beego@v1.12.3
```
⇒このエラーメッセージは、Goモジュールが依存関係に必要なgo.sumエントリを欠いていることが原因です。go.sumファイルは、プロジェクトで使用しているGoパッケージのチェックサムを記録し、正確な依存関係のバージョンを管理します。エラーメッセージで「missing go.sum entry for module providing package...」とあるのは、必要なモジュールのチェックサムがgo.sumにないということを意味します。

これを解決するには、以下の手順を試してください。

```
go get gopkg.in/yaml.v2
go get github.com/prometheus/client_golang/prometheus/promhttp
go get golang.org/x/crypto/acme/autocert
```
これでも問題が解決しない場合は、``を実行して、未使用の依存関係を整理し、必要な依存関係を正しく解決することができます。

```
go mod tidy
```
すると、このように依存関係を調整してくれます。

![Beego modo tidy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/a6ba919b-b419-77e6-e2f0-3278c20a9b2f.png)





# 参考にしたサイト

https://botoom.hashnode.dev/rest-api-with-golang-and-postgresql-using-beego