macOSでMysql,Go,Echo,GORM,sql-migrateを用いた環境構築を１から丁寧に解説

#自己紹介
現在都内の企業でエンジニアのインターン生としてお世話になっている大学２年生です！
これから学んだことや苦労したことを記事にしていこうと思います！
よろしくお願いします🙇🏻‍♂️

#はじめに
タイトル通りmacOSでGo,Echo,GORM,sql-migrateを用いた環境構築をします！
１から丁寧に解説していくので右も左もわからない人が見ても理解して環境構築できる内容になっています！

#環境
- OS:M1MacOS ver12.0.1
- DB:Mysql ver8.0.27
- SQLマイグレーションツール:sql-migrate
- フレームワーク:Echo
- ORM:GORM

#Goってなに？
>Goは、Googleがサポートするオープンソースのプログラミング言語である。
>高速で信頼性が高く、効率的なソフトウェアを大規模に構築できる。

参考 [Go公式](https://go.dev/)

#echoってなに？
>高性能で拡張可能かつミニマリストのGoのWebフレームワークである。

参考 [echo公式](https://echo.labstack.com/)

#GORMってなに？
GORMとはGo言語のORMです。

###そもそもORMってなに？
>Object-Relational-Mappingの略で、日本語ではオブジェクト関係マッピングと呼ばれるものです。具体的には、オブジェクト指向プログラムとリレーショナルデータベースをつなぐ役割をしてくれます。さらに、SQL処理が、簡単に短く書くことができます。


つまり、簡単に言うとGoとデータベースを簡単につなぐことができるということです。

参考

https://qiita.com/chan-p/items/cf3e007b82cc7fce2d81

https://qiita.com/shibaHaya/items/bc5c43bb4857f6cec67b

#sql-migrateってなに？
Go製のマイグレーションツールである。
SQLを使い慣れていない人でもマイグレーションツールを使用することで直感的にデータベースを操作することが可能です。
###そもそもマイグレーションとは
>一言で表現すると、Goの記述（=マイグレーションファイル）でデータベースの[テーブル操作]をするということです。
「テーブル操作」とは以下を指します。

>・テーブルを作成する
・テーブルを削除する
・カラムを追加する
・カラムを削除する
・カラムの名前やデータ型を変更する
・外部キーを設定する

参考
記事の内容はRubyですが参考になると思います。

https://diveintocode.jp/blogs/Technology/RailsMigration1

#データベースの作成
インターン先がMysqlを使っているため、Mysqlでデータベースを作成していきます。
そのためにまずはMysqlを自分のOSにインストールします。
私は[progate](https://prog-8.com/docs/mysql-env)さんの記事を参考にしたのでHomebrewを使いましたが、もっと簡単にインストールできそうだったのでそっちを参考にしてください。

https://kita-note.com/mysql-install-mac

インストールが完了しましたら

```sql:mysql
CREATE DATABASE [お好きなデータベース名];
```

でデータベースを作っておいてください。
###Mysqlってなに？
これに関しては初心者にもわかりやすい記事がありましたのでそちらを参考にしてください。

https://kinsta.com/jp/knowledgebase/what-is-mysql/

###Homebrewってなに？
>HomebrewはApple(またはLinuxシステム)が提供していない必要なものをインストールできます。

>参考　[Homebrew公式](https://brew.sh/index_ja)

>つまり、PS5をMac、モンハンをMysqlに例えると、
PS5だけではモンハンができないのでPS5の中にモンハンをダウンロードして遊ぼうとしたとき、必要になるのがHomebrewってことですね。

>わかりにくい例ですみません。ちなみに主はモンハンが好きです。


#Goの環境構築
[Go公式サイト](https://go.dev/dl/)でお使いのOSに合わせてインストールします。
goはこのgoパスsrc配下で基本的には開発していきますので、Goがインストールできましたら、cdコマンドでgoパスに移動し、mkdirコマンドで「src/お好きな名前のディレクトリ/api]を作ってください。
>これからは「お好きな名前のディレクトリ」=「App」として解説していきます。

ちなみにgoパスは

```terminal:ターミナル
go env
```

とターミナルに入力し、この中のGOPATH=""の配下がgoパスとなります。
Goがきちんとインストールできているかは、

```terminal:ターミナル
go version
```

これでGoのバージョン情報が表示されたらインストールできてます！
その後、Goのイントールで作ったapiディレクトリに移動し、以下のコマンドを実行してください。

```terminal:ターミナル
go mod init
```
go.modファイルが作成されるはずです。
これでgoの環境構築は完了です。
この辺の詳しい説明はこの記事が参考になりました。

https://zenn.dev/optimisuke/articles/105feac3f8e726830f8c

###ここまでのファイル構成

```
Goパス
└── App
　　　　　　　　　└── api(Go関連ファイル)  
     　　　　　　　└── go.mod

```
#echo,gorm,sql-migrateのセットアップ

###echo
```terminal:ターミナル
go get -u github.com/labstack/echo
```
###gorm
```terminal:ターミナル
go get github.com/jinzhu/gorm
```
###sql-migrate
```terminal:ターミナル
go get github.com/rubenv/sql-migrate/...
```
コマンド入力後、go.modファイルに追加され、go.sumファイルが作成されているはずです。

###sql-migrate設定ファイル
sql-migrateの設定ファイルを作成します。
デフォルトではdbconfig.ymlというファイル名が参照されるので、dbconfig.ymlというファイルを自分で作成する必要があります。

```yml:dbconfig.yml
development:
  #使用するDBを選択
  dialect: mysql

  #mysqlに接続するための情報を記入する
  #userNameに自分のユーザーネーム(rootだったらroot),passwordにそのユーザーのパスワード,
  #dbnameにデータベース名を入力
  datasource: userName:password@tcp(127.0.0.1)/dbname? 
  charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true

  #実行するsqlファイルの場所を選択している
  dir: sql/migrations

  #マイグレーション履歴を保存するテーブル名
  table: migrations
```

###ここまでのファイル構成
mkdirコマンドでsql/migrationsディレクトリを作っておきましょう。
sql-migrateでマイグレーションファイルを作ったときにこのディレクトリに作成されます。
今回は環境構築だけなので説明しませんが、次回作ろうと思っているCRUDなAPI作成の記事で解説しようと思います。

```
Goパス
└── App
　　　　　　　　　└── api(Go関連ファイル)  
     　　　　　　　├── sql
     　　　　　　　|   └── migrations 
     　　　　　　　├── dbconfig.yml
     　　　　　　　├── go.mod
     　　　　　　　└── go.sum

```

#環境構築完了
ここまででGo,Echo,GORM,sql-migrateを用いた環境構築は終了です。
個人的にはかなり丁寧に解説したと思っていますが、できましたか？
次の記事では今回作った環境でCRUDなAPIを作成するまでの手順を詳しく解説します。
↓次の記事

https://qiita.com/yusuke1120925/items/a6e05178cf6e6bf1f030

:::note warn
間違っている箇所もあるとは思いますが、教えてくださるとありがたいです。
:::

今回と次回の記事は全体的にこの記事を参考にしています。

https://qiita.com/gs1068/items/194a4c35a3709d7a4342

ではいい一日を👍