0Pricing
Go Academy · レッスン

database/sqlとドライバー

DBのセットアップ、QueryRow、Scan、コネクションプール

「database/sqlとドライバー」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

database/sqlの概要

database/sqlはGo標準のデータベース抽象化レイヤーです。コネクションプールを管理し、ドライバープラグインを通じて任意のデータベースと連携します。

ドライバーの登録

副作用(ドライバーの登録)のためにドライバーパッケージをインポートします。その後、接続を開きます:

import _ "github.com/lib/pq" // PostgreSQL driver

db, err := sql.Open("postgres", "postgres://user:pass@localhost/mydb?sslmode=disable")
if err != nil { log.Fatal(err) }
defer db.Close()

sql.Openとdb.Ping

sql.Openは接続せず、DSNを検証するだけです。接続が有効か確認するには、db.Ping()またはdb.PingContext(ctx)を呼び出します。

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

行のクエリ

db.QueryContextを使用してSELECTを実行し、行をスキャンします:

rows, err := db.QueryContext(ctx, "SELECT id, name FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()
for rows.Next() {
    var id int; var name string
    rows.Scan(&id, &name)
}

1行のクエリ

db.QueryRowContextは、最大1件の結果を返すと想定されるクエリ向けに*Rowを返します:

var name string
err := db.QueryRowContext(ctx, "SELECT name FROM users WHERE id = $1", id).Scan(&name)
if errors.Is(err, sql.ErrNoRows) { /* not found */ }

更新系処理の実行

INSERT、UPDATE、DELETEにはdb.ExecContextを使用します。影響を受けた行数と最後に挿入されたIDを持つResultを返します。

result, err := db.ExecContext(ctx, "INSERT INTO users(name) VALUES($1)", name)
if err != nil { return err }
id, _ := result.LastInsertId()

プリペアドステートメント

ステートメントを一度準備し、効率的に何度も実行します:

stmt, err := db.PrepareContext(ctx, "SELECT id FROM users WHERE email = $1")
defer stmt.Close()
for _, email := range emails {
    row := stmt.QueryRowContext(ctx, email)
}

コネクションプールの設定

本番環境向けにプールを設定します:

db.SetMaxOpenConns(25)
db.SetMaxIdleConns(25)
db.SetConnMaxLifetime(5 * time.Minute)

rows.Err()の確認

行のループが終わったら、必ずrows.Err()を確認します。ネットワークエラーによってループが途中で終了している可能性があるためです。

if err := rows.Err(); err != nil { return err }

NULL値

sql.NullStringやsql.NullInt64などを使用して、データベースのNULL値を処理します。これらを使わないと、NULLをポインターではないGoの型にスキャンしたときにパニックが発生する可能性があります。

var bio sql.NullString
rows.Scan(&bio)
if bio.Valid { fmt.Println(bio.String) }

ドライバー一覧

よく使われるドライバー:github.com/lib/pq(PostgreSQL)、github.com/go-sql-driver/mysql(MySQL)、modernc.org/sqlite(SQLite、Pure Go)。

クイックチェック

クエリの後に必ずrows.Close()を呼び出し、rows.Err()を確認しなければならないのはなぜですか?

復習:database/sql

重要なポイント:

  • 副作用のために_を使ってドライバーをインポートし、sql.OpenとPingを呼び出します
  • QueryContext → rows.Next + Scan + rows.Close + rows.Err
  • 更新系処理にはExecContextを、1行の取得にはQueryRowContextを使用します
  • プールにはSetMaxOpenConns、SetMaxIdleConns、SetConnMaxLifetimeを設定します

よくある質問

「database/sqlとドライバー」レッスンは無料ですか?

はい。「database/sqlとドライバー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「database/sqlとドライバー」で何を学びますか?

DBのセットアップ、QueryRow、Scan、コネクションプール ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「database/sqlとドライバー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. database/sqlとドライバー
  2. sqlx:構造体スキャンと名前付きクエリ
  3. pgx:高性能PostgreSQLドライバー
  4. トランザクションとマイグレーション
← Go Academyに戻る