database/sqlパッケージの使用

Go言語において、データベースとの連携を行う際には、標準パッケージであるdatabase/sqlが基本となります。このパッケージは、データベース操作のための抽象インターフェースを提供しており、具体的なデータベース(MySQL、PostgreSQL、SQLiteなど)にはドライバを通じて接続します。


1. database/sqlパッケージの概要

database/sqlパッケージは、以下の機能を提供します:

  • データベースとの接続管理

  • SQLクエリの実行

  • プレースホルダを使ったパラメータバインディング

  • トランザクション制御

  • エラーハンドリング

ただし、具体的なデータベースアクセスにはドライバが必要です(例:github.com/go-sql-driver/mysqlなど)。


2. 使用手順

2.1 ドライバのインポートと初期化

go
import ( "database/sql" _ "github.com/go-sql-driver/mysql" // ドライバの初期化(名前付きで未使用) )

2.2 データベース接続の作成

go
db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname") if err != nil { log.Fatal(err) } defer db.Close()
  • sql.Open()はドライバに接続する準備を行う(実際の接続は遅延される)。

  • db.Ping()を使うと接続確認ができる。

go
if err := db.Ping(); err != nil { log.Fatal(err) }

3. クエリの実行

3.1 データの取得(SELECT)

go
rows, err := db.Query("SELECT id, name FROM users WHERE age > ?", 20) if err != nil { log.Fatal(err) } defer rows.Close() for rows.Next() { var id int var name string if err := rows.Scan(&id, &name); err != nil { log.Fatal(err) } fmt.Println(id, name) }
  • db.Query()は複数行の結果を取得する場合に使用。

  • rows.Scan()で各行の値を変数に取り出す。

3.2 1件の取得(SELECT)

go
row := db.QueryRow("SELECT name FROM users WHERE id = ?", 1) var name string if err := row.Scan(&name); err != nil { log.Fatal(err) }

3.3 データの追加・更新・削除(INSERT, UPDATE, DELETE)

go
result, err := db.Exec("INSERT INTO users(name, age) VALUES (?, ?)", "Taro", 30) if err != nil { log.Fatal(err) } lastID, _ := result.LastInsertId() rowsAffected, _ := result.RowsAffected() fmt.Println("Last Insert ID:", lastID) fmt.Println("Rows Affected:", rowsAffected)

4. トランザクション処理

go
tx, err := db.Begin() if err != nil { log.Fatal(err) } _, err = tx.Exec("UPDATE accounts SET balance = balance - 100 WHERE id = ?", 1) if err != nil { tx.Rollback() log.Fatal(err) } _, err = tx.Exec("UPDATE accounts SET balance = balance + 100 WHERE id = ?", 2) if err != nil { tx.Rollback() log.Fatal(err) } if err := tx.Commit(); err != nil { log.Fatal(err) }

5. プレースホルダとセキュリティ

?を使ったプレースホルダを利用することで、SQLインジェクションを防止できます。Goのdatabase/sqlパッケージはこの点で安全性の高い設計となっています。


6. 主な注意点

  • 接続プールは内部で自動管理されており、db.SetMaxOpenConns()などで調整可能。

  • エラーハンドリングは必ず行うこと(ScanQuery後のerr確認)。

  • リソースの解放rows.Close())を怠らない。


まとめ

Goのdatabase/sqlパッケージは、データベースとの接続やSQL操作を汎用的に扱うための強力なインターフェースです。シンプルで直感的なAPIでありながら、接続プールやトランザクションなどの高度な機能も備えています。具体的なデータベースと連携する際には、適切なドライバを選び、SQLインジェクション対策としてプレースホルダを活用することが重要です。

他のORMライブラリ(例:GORM)と組み合わせて使うことも可能ですが、database/sqlの理解はその前提として非常に重要です。

生成日:2025/05/03