Go言語でのデータベースエラーハンドリング完全解説!初心者でも失敗しないコツ
生徒
「Go言語でデータベースを使うと、エラーが出たときにどう対応すればいいのか分かりません……」
先生
「Go言語では、エラーをきちんと確認して分けて考えることがとても大切です。」
生徒
「全部同じエラーとして扱ってはいけないんですか?」
先生
「はい。データベースエラーには種類があり、それぞれに合った対応が必要です。」
1. エラーハンドリングとは何か
エラーハンドリングとは、プログラムで問題が起きたときに、その内容を確認し、正しく対処することです。
データベース操作では、接続できない、データが存在しない、SQLが間違っているなど、さまざまな失敗が起こります。
これを無視すると、プログラムが突然止まったり、間違った動作をしたりします。
2. Go言語でエラーが重要な理由
Go言語は「エラーを隠さない」言語です。多くの処理が、結果と一緒にエラーを返します。
これは「失敗したかどうかを必ず確認しなさい」という設計思想です。
データベース操作では、この考え方が特に重要になります。
3. データベースエラーの基本形
row := db.QueryRow("SELECT name FROM users WHERE id = ?", 1)
err := row.Scan(&name)
if err != nil {
// エラー処理
}
errには「何も問題がなければnil」「問題があれば内容」が入ります。
まずは「必ずerrを確認する」ことが最初のコツです。
4. sql.ErrNoRowsの扱い方
データが見つからなかった場合、Go言語ではsql.ErrNoRowsという特別なエラーが返されます。
if err == sql.ErrNoRows {
// データが存在しない場合の処理
} else if err != nil {
// その他のエラー
}
これは「失敗」ではなく、「結果がなかった」という状態です。
初心者はすべて同じエラーとして扱いがちなので注意が必要です。
5. 接続エラーの考え方
データベースに接続できない場合は、ネットワークや設定の問題が考えられます。
この場合、処理を続けても正しい結果は得られません。
ログを出力して、処理を中断する判断も重要なエラーハンドリングです。
6. トランザクションとエラー
複数のSQLをまとめて実行する場合、途中で失敗したら元に戻す必要があります。
tx, err := db.Begin()
if err != nil {
return err
}
err = tx.Commit()
if err != nil {
tx.Rollback()
}
失敗したときにRollbackすることで、データの不整合を防げます。
7. エラーメッセージの出し方
エラーは、そのまま画面に出すのではなく、ログとして記録するのが基本です。
特にデータベースエラーには、内部情報が含まれる場合があります。
利用者向けと開発者向けの情報を分ける意識が大切です。
8. 初心者がやりがちな失敗
errを無視する、すべてpanicで止める、エラー内容を見ずに同じ処理をする、という失敗がよくあります。
Go言語では、エラーを確認し、状況に応じて処理を分けることが基本です。
これを意識するだけで、データベース操作の安全性は大きく向上します。