はじめに
クラウドやコンテナに限らず、インフラ周りの検証をするとき、テスト用のアプリケーションを利用することが必要となってきました。今までは公式サイト等で用意しているテスト用アプリを利用することがほとんどでしたが、さすがにそれではいかんと思い、テスト用アプリを用意することにしました。
今回は、以前から少しずつ勉強していたGo言語を使い、ひとまず動くアプリを用意することができたので、簡単な説明を載せておきます。なお、今回のコードはこちらの記事で紹介しているコードをベースに、一部変更を加えたものになります。
学習目的として記録を残している面が強いので、その点はご了承ください。
アプリ
アプリケーションは簡単なToDo管理アプリになります。Tag
Content
TimeLimit
の3つの値を入力し、ToDoのタイプ(Tag
)、内容(Content
)、期限(TimeLimit
)を入力します。設定したToDoは内容の編集や削除も可能です。
実際のコードはGitHubの以下のリポジトリに配置しています。
プログラムを動かす環境から接続可能なPostgreSQLを用意し、Jsonファイルに接続情報を入力すれば動くはずです。
利用したフレームワーク
今回は簡単にWebアプリを用意したかったため、Gin、Gormを利用しました。各フレームワークについては以下のドキュメントなどを参照してください。どちらも人気のフレームワークのため、インターネット上に多くの情報があり、思った以上に簡単に書くことができました。
※参考リンク:
- GitHub - gin-gonic/gin
- Gorm公式ドキュメント
- Qiita - Go / Gin で超簡単なWebアプリを作る
- Qiita - Go言語のGORMを使ってみた①
- Qiita - 【GORM】Go言語でORM触ってみた
今回はじめてGin/Gormを利用したため、個人的に気になった個所についてメモしておきます。
gorm.Model
データベースのテーブル設計はgorm.AutoMigrate
による自動マイグレーション機能を利用します。自動マイグレーションにより、アプリ実行時にテーブルが存在しない場合、指定した構造体に基づいてテーブルを作成するようにしています(カラムが不足している場合は追加することも可能ですが、カラムの削除はしてくれないようです)。テーブルの設計はTodo
構造体で定義しており、その中にはgorm.Model
という項目があります。gorm.Model
を設定することで、テーブルにID
CreatedAt
UpdatedAt
DeletedAt
カラムが追加されます。
特に指定をしなければ、テーブルは構造体の複数形(ここではtodos
)で作成されます。
// data struct type Todo struct { gorm.Model Tag string Content string TimeLimit string }
※参考リンク:
DBへの接続方法
main.go
でデータベースにアクセスする際、当初は以下のように、毎回gorm.Open
を実行し、引数に接続情報を設定していました。
func db_create(tag string, content string, timelimit string) { db, err := gorm.Open("postgres", "user=<user> password=<password> host=<db endpoint> port=<port> dbname=todo sslmode=disable") if err != nil { panic(err) } db.Create(&Todo{Tag: tag, Content: content, TimeLimit: timelimit}) defer db.Close() }
しかし、テスト用とはいえ、データベースを用意するたびに毎回複数箇所のコードを修正するため、最終的にはJsonファイルから情報を取ってきてデータベースにアクセスするdb_connect
機能を用意し、これを呼び出してデータベースへアクセスするように変更しました。
※参考リンク:
json.Unmarshal
Jsonファイルをパースする際にjson.Unmarshal
を利用しますが、この時に渡すデータ型が一瞬分からなくなったので、ここに残しておきます。困ったときは公式ドキュメントをまず読むようにしましょう。
func Unmarshal(data []byte, v interface{}) error
※参考リンク: