Go言語のプリペアドステートメント完全解説!安全なSQL実行を初心者向けにやさしく理解
生徒
「Go言語でデータベースを使うとき、SQLってそのまま書いても大丈夫なんですか?」
先生
「書くことはできますが、安全に使うためにはプリペアドステートメントという仕組みを使うのが基本です。」
生徒
「名前が難しそうで、ちょっと不安です……」
先生
「大丈夫です。意味はとてもシンプルなので、例えを使って説明します。」
1. プリペアドステートメントとは何か
プリペアドステートメントとは、あらかじめSQLの形を決めておき、あとから値だけを入れて実行する方法です。 Go言語でデータベース操作を行うとき、安全性と安定性を高めるためによく使われます。 料理に例えると、レシピを先に用意しておき、食材だけを入れ替えて何度も同じ料理を作るイメージです。 毎回一からレシピを書く必要がないため、ミスが減り、処理も分かりやすくなります。
2. なぜ安全なのかを初心者向けに説明
SQLを文字列として直接つなげてしまうと、意図しない命令が入り込む危険があります。 これをSQLインジェクションと呼び、データを勝手に見られたり消されたりする原因になります。 プリペアドステートメントを使うと、SQLの命令部分と値の部分が分かれて扱われます。 そのため、値の中に怪しい文字が入っても、命令として実行されず、安全に処理されます。 初心者の方ほど、最初から安全な書き方を覚えることが大切です。
3. Go言語でプリペアドステートメントを作る流れ
Go言語では、まずデータベース接続を行い、その後にSQLを準備します。
この準備する作業がPrepareです。
Prepareは「このSQLを使いますよ」とデータベースに伝える合図のようなものです。
そのあとで、実際の値を渡してSQLを実行します。
最後に、使い終わったら必ず閉じることも重要なポイントです。
stmt, err := db.Prepare("SELECT name FROM users WHERE id = ?")
if err != nil {
// エラー処理
}
defer stmt.Close()
4. プレースホルダとは何か
SQLの中にある?は、プレースホルダと呼ばれます。
これは「あとから値が入る場所」という意味です。
例えるなら、申込書の空欄のようなもので、名前や年齢を書き込む場所だけを先に用意している状態です。
Go言語では、このプレースホルダに安全な形で値を渡すことができます。
直接文字をつなげない点が、安全性を高める大きな理由です。
5. プリペアドステートメントの実行方法
PrepareでSQLを用意したら、次は実行です。
1行の結果を取得したい場合はQueryRowを使います。
ここで値を渡すと、プレースホルダの部分に自動で当てはめられます。
SQL文を何度も書かなくてよいため、コードが読みやすくなります。
var name string
err = stmt.QueryRow(1).Scan(&name)
if err != nil {
// エラー処理
}
6. Execを使った更新処理
データを取得するだけでなく、追加や更新を行う場合もプリペアドステートメントは活躍します。
Execは、データの登録や変更を行うための実行方法です。
結果として行が返ってこない処理では、QueryではなくExecを使います。
書類を読むのではなく、書き換える作業だと考えると分かりやすいです。
stmt, _ := db.Prepare("UPDATE users SET name = ? WHERE id = ?")
defer stmt.Close()
stmt.Exec("Taro", 1)
7. 初心者が気をつけたいポイント
プリペアドステートメントを使ったら、必ずCloseすることが重要です。 閉じ忘れると、データベースに負担がかかり、動作が重くなる原因になります。 また、エラーを無視せず、必ず確認する習慣をつけましょう。 エラーは失敗ではなく、問題を教えてくれるメッセージです。 基本を守ることで、安全で信頼できるGo言語のデータベース処理が書けるようになります。