0Pricing
Go Academy · レッスン

接続の開始

データベースに接続します

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

database/sqlパッケージ

Goの標準database/sqlパッケージは、汎用的でデータベースに依存しないAPIを提供します。PostgreSQLやMySQLなど、使用するデータベースに対応したドライバーと組み合わせて使います。

  • 1つのAPIで多くのデータベースに対応
  • 接続プールを組み込みで提供
  • パラメーター化クエリで安全に実行

ドライバーのインポート

ドライバーはブランクインポートによって自身を登録します。アンダースコアは、ドライバーを直接呼び出すためではなく、登録という副作用だけを目的にインポートすることを示します。

import (
    "database/sql"
    _ "github.com/lib/pq"
)

sql.Open

sql.Openは、ドライバー名とデータソース名(DSN)を受け取ります。この時点では実際には接続せず、プールを準備するだけです。

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

dbはプール

返される*sql.DBは単一の接続ではなく、多数のgoroutineから安全に同時利用できる接続プールです。アプリケーションの起動時に1回だけ開き、アプリケーション全体で共有します。

Pingで確認する

Openは遅延実行されるため、Pingを使って実際に接続を確立し、データベースに到達できることと認証情報が有効であることを確認します。

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

プールを閉じる

メイン関数またはセットアップ関数でdb.Close()をdeferします。クエリごとに閉じることはほとんどなく、アプリケーション全体を終了するときだけ閉じます。

defer db.Close()

プールの調整

SetMaxOpenConns、SetMaxIdleConns、SetConnMaxLifetimeを使ってプールを制御します。これらにより、データベースの接続を使い果たすことを防ぎ、古い接続を再作成できます。

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

実行可能なインメモリ例

実際のドライバーにはネットワーク上のデータベースが必要です。そのため、この実行可能な例では、標準ライブラリの型だけを使い、模擬的なopenとpingで同じライフサイクルを示します。

package main

import (
    "errors"
    "fmt"
)

type DB struct{ dsn string }

func Open(driver, dsn string) (*DB, error) {
    if dsn == "" {
        return nil, errors.New("empty dsn")
    }
    return &DB{dsn: dsn}, nil
}

func (db *DB) Ping() error { return nil }
func (db *DB) Close() error { return nil }

func main() {
    db, err := Open("postgres", "postgres://localhost/mydb")
    if err != nil {
        fmt.Println("open error:", err)
        return
    }
    defer db.Close()
    if err := db.Ping(); err != nil {
        fmt.Println("ping error:", err)
        return
    }
    fmt.Println("connected to", db.dsn)
}

context対応のバリエーション

PingContext、QueryContext、ExecContextを優先して使用し、呼び出しが期限とキャンセルに従うようにします。contextを渡すことで、応答しないデータベース呼び出しによるブロック時間に上限を設けられます。

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
err := db.PingContext(ctx)

DSNの形式

DSNの形式はドライバーごとに異なります。PostgreSQLはURLを受け入れ、MySQLではuser:pass@tcp(host:3306)/dbnameを使用します。必ずドライバーのドキュメントを確認し、認証情報をハードコードしないでください。

1つのプールを長期間使う

よくある間違いは、リクエストごとにsql.Openを呼び出すことです。これではプールの利点が失われ、接続を使い果たします。起動時に1回だけ開き、*sql.DBを保存して、アプリケーション全体で再利用します。

クイックチェック

接続に関する知識を確認しましょう。

振り返り

接続の開き方について学びました。

  • ドライバーをブランクインポートし、ドライバーとDSNを指定してsql.Openを呼び出す
  • *sql.DBは同時利用に安全なプールで、1回だけ開く
  • Pingで実際の接続を確認する
  • プールを調整し、context対応のメソッドを使う
  • 終了時にdefer db.Close()を実行する

よくある質問

「接続の開始」レッスンは無料ですか?

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

「接続の開始」で何を学びますか?

データベースに接続します ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「接続の開始」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 接続の開始
  2. 行のクエリ
  3. プリペアドステートメント
  4. トランザクション
← Go Academyに戻る