効果的なエラー処理は、堅牢なアプリケーション開発における重要な部分であり、特に GORM を使用してデータベースとインターフェースする場合に顕著になります。チェーン可能な API の影響を受ける GORM のエラー処理に対するアプローチでは、微妙な理解が必要です。
基本的なエラー処理
GORM はエラー処理をチェーン可能なメソッド構文に組み込んでいます。*gorm.DB
インスタンスには、エラーが発生した場合に設定される Error
フィールドが含まれています。一般的なプラクティスは、データベース操作の実行後、特に フィニッシャーメソッド の後にこのフィールドを確認することです。
メソッドチェーンの後で、Error
フィールドを確認することが重要です
if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil { |
または
if result := db.Where("name = ?", "jinzhu").First(&user); result.Error != nil { |
ErrRecordNotFound
GORM は、First
、Last
、Take
などのメソッドを使用してレコードが見つからない場合は ErrRecordNotFound
を返します。
err := db.First(&user, 100).Error |
エラーコードの処理
多くのデータベースは特定のコードでエラーを返し、制約違反、接続の問題、構文エラーなどのさまざまな問題を示す場合があります。GORM でこれらのエラーコードを処理するには、データベースによって返されるエラーを解析して関連するコードを抽出する必要があります
- 例: MySQL エラーコードの処理
import ( |
Dialect Translated Errors
GORM は、TranslateError
が有効な場合、使用されているデータベースの方言に関連する特定のエラーを返すことができます、GORM はデータベース固有のエラーを独自の一般化されたエラーに変換します。
db, err := gorm.Open(postgres.Open(postgresDSN), &gorm.Config{TranslateError: true}) |
- ErrDuplicatedKey
このエラーは、挿入操作で一意キーの制約に違反した場合に発生します
result := db.Create(&newRecord) |
- ErrForeignKeyViolated
このエラーは、外部キー制約に違反した場合に発生します
result := db.Create(&newRecord) |
TranslateError
を有効にすることで、GORM は異なるデータベース間でエラーを処理するためのより統一された方法を提供し、データベース固有のエラーを一般的な GORM エラータイプに変換します。
Errors
GORM が返すことができるエラーの完全なリストについては、GORM のドキュメントの エラーリスト を参照してください。