Go言語でのDBアクセスについて

database/sql

概要

Go言語のdatabase/sqlパッケージは、SQLデータベース操作のための標準インターフェースを提供するパッケージです。RDBMSごとに異なるドライバを組み合わせて利用することで、MySQLやPostgreSQL、SQLiteなど多様なデータベースに対応できます[2][5][8]

主な特徴と使い方

  • ドライバのインポート
    利用するDBに応じたドライバ(例:github.com/go-sql-driver/mysql)を_付きでインポートします。これはドライバのinit()を実行し、database/sqlから利用可能にするためです[2][3]

  • 接続管理
    sql.Openでデータベース接続用の*sql.DBオブジェクトを取得しますが、これは実際のコネクションではなくコネクションプールの管理やクエリ発行のための抽象インターフェースです。実接続の確認にはdb.Ping()を使います[2][3]

  • クエリ実行

    • 複数行のSELECTはdb.Query、1行だけ取得する場合はdb.QueryRowを使います。

    • INSERT/UPDATE/DELETEなどはdb.Execで実行し、LastInsertIdRowsAffectedで結果を取得できます[2][6][18]

  • トランザクション
    db.Beginでトランザクションを開始し、tx.Commitまたはtx.Rollbackで完了・中断を制御します。エラー発生時は必ずロールバックすることが推奨されます[2][17]

  • プリペアドステートメントとプレースホルダ
    SQLインジェクション対策として、?$1などのプレースホルダを使い、引数で値を渡します[2][15]

  • NULL値の扱い
    NULLを許容するカラムはポインタ型やsql.NullStringなどの専用型で受け取ります[6]

  • 接続のクローズ
    使用後はdb.Close()でコネクションプールを閉じます。各クエリのrowsdefer rows.Close()で明示的にクローズします[2]

まとめ database/sqlは汎用的なインターフェースを持ち、ドライバを切り替えるだけで異なるDBにも対応可能です。コネクションプールやトランザクション、プリペアドステートメントなど、実運用に必要な機能を標準で備えており、GoでのDB操作の基盤となっています[2][3][5]

リファレンス

チュートリアル

参考