[Go言語]ginフレームワークでアプリ開発~MySQLエラーハンドリング~

前回は、MySQLコンテナに対して、Productの登録と検索処理を実装しました。

今回は、MySQLのエラーハンドリングを実装していきます。

前回

プロジェクト構成

以下のディレクトリとファイルを作成してください。

MySQLエラーハンドリング

処理を実装する過程で、発生したエラーの種類ごとにエラーハンドリングをしたくなる時があります。

例えば、Productテーブルのnameカラムにはユニークキーが設定されており、同じ名前の商品を登録した場合は重複エラー(400)を、それ以外はサーバーエラー(500)を出したい、などがユースケースとして考えられます。

そんな時は、「github.com/go-sql-driver/mysql」パッケージのMySQLError Structが使えます。

MySQLErrorのNumberには、発生したエラーに紐付くエラーコードが自動で入ります。

例えば、重複エラーの場合は、1062番が入ります。

これを使えば、発生したエラーの種別ごとに処理が実装できそうです。

実際に試して見ましょう。

Save ~MySQLエラーハンドリング ~

product_dao.goに実装したSaveメソッドを以下のように修正します。

まず、「sqlErr, ok := result.Error.(*mysql.MySQLError)」にて、発生したエラーをMySQLError Structにキャストしました。

ok変数には、キャストが成功した場合はtrue、失敗した場合はfalseが入ります。※okは、Go言語の慣習です

エラーコードを取り出すには、単純にsqlErr.Numberにアクセスするだけです。

エラーコードを調べるために、「fmt.Println(“Mysql Error Key”, sqlErr.Number)」を実装し、出力内容を確認してます。

確認した結果、nameが重複した場合のエラーコードは、「1062」番だったので、switch文で処理をしました。

Talend API Testerで動作確認をしてみましょう。

下記のコマンドで、dockerコンテナを立ち上げてください。

また、テストに使うデータは以下のようになっています。

nameに設定しているcoca colaは、既にMySQLに登録ずみです。

この状態で「http://localhost:8080/products」に対してリクエストを送ると、400エラーが発生するはずです。

OKですね。

Get ~MySQLエラーハンドリング ~

続いて、Getメソッドにもエラーハンドリングを追加しましょう。

Getの場合は、レコードが存在しない場合のエラーハンドリングになります。

存在しないIDを渡した時にエラーが発生することになりますが、Saveのエラーハンドリングのようにエラーコードを拾うことができませんでした。

単に「record not found」のエラーメッセージが返ってくるだけです。

そのため、以下のように実装しました。

stringsパッケージのContainsメソッドで、取得したエラーメッセージがソースコード内に定義したエラーメッセージに含まれているかチェックしました。

「record not found」が含まれていた場合は、404エラーが発生します。

Talend API Testerから存在しないid(10000)でリクエストして見ましょう。

「http://localhost:8080/products/10000」

想定内のメッセージが返却されました。

リファクタリング~MySQLエラーハンドリング~

SaveとGetメソッドに実装したエラーハンドリングの処理ですが、リファクタリングができそうです。

mysql_utils.goに以下の実装をします。

上記は、Save、Getメソッドのエラーハンドリングを一纏めにしたイメージです。

ParseError関数ををproduct_dao.goのSave、Getメソッドから呼び出しましょう。

だいぶスッキリしましたね。

次回

次回は、MySQLのupdate処理について学びましょう。

関連記事

コメントを残す