たいさブログ

taisa's engineer blog

Go

Go言語 ORMライブラリ GORMの使い方

投稿日:2019年6月26日 更新日:


Go言語 ORMライブラリのGORMの簡単な使い方を確認してみました。また、公式ドキュメントにしっかりと使い方が書いてありますので基本的にはそちらを参考にしてもらえればと思います(すべてではないですが日本語訳もされています)。その上でクイックスタートを元に簡単な使い方と挙動を確認してみます。

http://gorm.io/ja_JP/docs/

インストール

以下のコマンドでインストールできます。

クイックスタート

公式ドキュメントにあるクイックスタートを実行してみました。DBだけsqliteではなくmysqlに変更しています。

実行してみるとproductsテーブルが作成され、以下のカラムとレコードができました。structでは宣言していない、idcreated_atupdated_atdeleted_atカラムができ、deleted_atに日付が入りソフトデリートが行われています。

gorm.Model

gorm.Modelを宣言するとidcreated_atupdated_atdeleted_atカラムが自動的に注入されます。また,deleted_atカラムがある場合、Deleteはソフトデリートになります。

参考:
http://gorm.io/ja_JP/docs/conventions.html

SQL実行ログ出力

先ほど実行したプログラムでどんなSQLが実行されたか確認してみます。db.LogMode(true)を設定するとSQLの実行ログが確認できます。

実行SQLや実行時間が確認できるようになりました。

created_atupdated_atdeleted_atが不要な場合

テーブルによってはcreated_atupdated_atdeleted_atが不要な場合もあります。その時はgorm.Modelを使わなければカラムは作られません(IDだけはできるよう個別に記述しています)。

この場合、先ほどのSQL実行ログは下記のようになります。deleted_atカラムがないので今回のレコード削除はハードデリートになります。また、DELETE文でwhere product.id = 1となっているのは、db.Create(&Product{Code: "L1212", Price: 1000})実行時のIDを引き継いでいるようで、db.Create(&Product{Code: "L1212", Price: 1000})を削除するとwhere product.id = 1の指定はなくなります。もしくはproduct.ID = 2Delete実行前に記述するとwhere product.id = 2と条件が変わってくれます。

テーブル名を単数形にする場合

マイグレーションを実行すると生成されるテーブル名はproductsのように自動的に複数系になりますが、複数形にしたくない場合もあります。その時はdb.SingularTable(true)を宣言するとテーブルが単数形で生成されます。

参考:
http://gorm.io/ja_JP/docs/conventions.html

GORM本体のテストカバレッジ

OSSライブラリを使う時、どのくらいテストが書かれているか気になったりするので確認してみました。GORM本体にはtest_all.shというテストすべてを実行するスクリプトが用意されているのでそれを元にカバレッジを出してみました。(初期実行時はライブラリが足りないなど出るので都度追加しました。)また、mysqlのテストをする為にmain_test.goに書かれている以下の記述に事前に設定を合わせておく必要があります。

今回は、postgresmssql環境がないのでmysqlsqliteだけに限定しました。go testのあとに-coverprofile=cover.outを追記してカバレッジを出力します。その後go tool cover -html=cover.out -o cover.htmlを実行してhtmlに変換しました。

実行してみると全体ではcoverage: 81.7% of statementsとカバレッジが81.7%でファイル毎にみても以下のようになっていました。

ソース

https://github.com/taisa831/sandbox-gorm

まとめ

非常に簡単なところだけを触っただけで分かりませんが、通して導入しやすく安定したライブラリだと思いました。個人的にORMはあまり積極的に使わない方ですが簡単に扱える、学習コストが低い、実行SQLを確認しながら扱える、などがあると導入障壁が低くてよいですね。


-Go
-

執筆者:

関連記事

[Golang] Goを始めたらまずはioパッケージを知るべし

Goを書いているとio.writerとio.readerを扱うケースが頻繁に出てきますが、これはioパッケージが多くの他のパッケージのインターフェースになっているからなのでioパッケージを知っておくこ …

Golangを使ってJWTを15分で理解する

JWTとは JWT(ジョットと言うらしい)はJSON Web Tokenの略で、JSONをベースとしたアクセストークンのためのオープン標準 (RFC 7519) です。色々記事を見ましたが、最終的にW …

Go言語 GORM+GinでTODOリストのAPIを作ってみた

前回の「Go言語 GORM+GinでTODOリストを作ってみた」に続いて「GORM+Gin」でTODOリストのAPIを作ってみました。ソースコードは前回からの差分だけを記載しています。できたものは下記 …

Go言語 GORM+GinでTODOリストを作ってみた

前回の「Go言語 ORMライブラリ GORMの使い方」に続いて「GORM+Gin」でTODOリストを作ってみました。使い方は「GitHubのREADME」を参考にしました。できたものは下記URLから確 …

Golang 1.13 released! The difference from 1.12 to 1.13

Golang 1.13 was released in 3 September 2019. This post has difference from 1.12 to 1.13. I check th …

Top