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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- database/sqlとドライバー
- sqlx:構造体スキャンと名前付きクエリ
- pgx:高性能PostgreSQLドライバー
- トランザクションとマイグレーション