接続の開始
データベースに接続します
「接続の開始」は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フィードバックを取得できます。ローカル設定は不要です。