pgx:高性能PostgreSQLドライバー
pgxpool、Copyプロトコル、バッチクエリ
「pgx:高性能PostgreSQLドライバー」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
pgxとは
github.com/jackc/pgx/v5はPostgreSQL専用のGoドライバーです。database/sqlでは利用できないCOPYプロトコル、通知、プリペアドステートメントのキャッシュなど、高度なPostgreSQL機能をサポートするネイティブAPIを備えています。
pgxでの接続
pgxのネイティブプールまたはdatabase/sql互換レイヤーを使用します:
// Native pgx pool
pool, err := pgxpool.New(ctx, "postgres://user:pass@localhost/mydb")
if err != nil { log.Fatal(err) }
defer pool.Close()pgxpool
pgxpool.Newは、管理されたコネクションプールを作成します。パース済みの設定で構成します:
config, _ := pgxpool.ParseConfig("postgres://...")
config.MaxConns = 10
pool, _ := pgxpool.NewWithConfig(ctx, config)pgxでのクエリ
pgxでは、pool.Queryとpgx.CollectRowsのヘルパー関数を使用します:
rows, _ := pool.Query(ctx, "SELECT id, name FROM users WHERE active=$1", true)
users, err := pgx.CollectRows(rows, pgx.RowToStructByName[User])RowToStructByName
pgx.RowToStructByNameは、sqlxのSelectと同様に、小文字化したフィールド名またはdbタグを使ってカラム名を構造体のフィールドにマッピングします。
1行のスキャン
1行のクエリにはpool.QueryRowを使用します:
var name string
err := pool.QueryRow(ctx, "SELECT name FROM users WHERE id=$1", id).Scan(&name)バッチクエリ
pgxでは、pool.SendBatchを使用して、1回のネットワークラウンドトリップで複数のクエリを送信できます:
batch := &pgx.Batch{}
batch.Queue("SELECT name FROM users WHERE id=$1", 1)
batch.Queue("SELECT name FROM users WHERE id=$1", 2)
results := pool.SendBatch(ctx, batch)
defer results.Close()COPYプロトコル
大量のデータを挿入する場合、pgxはPostgreSQLのバイナリCOPYプロトコルをサポートしています。これは個別のINSERT文よりもはるかに高速です:
conn, _ := pool.Acquire(ctx)
defer conn.Release()
conn.Conn().CopyFrom(ctx, pgx.Identifier{"users"}, []string{"name","email"}, pgx.CopyFromRows(rows))Listen/Notify
pgxは、DB内でリアルタイムのpub/subを実現するPostgreSQLのLISTEN/NOTIFYをサポートしています:
conn, _ := pool.Acquire(ctx)
conn.Exec(ctx, "LISTEN events")
notification, _ := conn.Conn().WaitForNotification(ctx)
fmt.Println(notification.Payload)database/sqlでのpgx
既存のsqlベースのコードとの互換性を保つため、pgxをdatabase/sqlドライバーとして使用します:
import pgxstdlib "github.com/jackc/pgx/v5/stdlib"
db := sql.OpenDB(pgxstdlib.OpenDBFromPool(pool))低レベルのpgconn
pgconnはpgxの低レベル接続ライブラリで、PostgreSQLの生のワイヤープロトコルを公開します。独自のプロトコル処理や管理ツールに使用します。
クイックチェック
pgxのCOPYプロトコルが複数のINSERT文より高速なのはなぜですか?
復習:pgx
重要なポイント:
- 管理されたコネクションプールにはpgxpoolを使用し、MaxConnsで設定します
- 使いやすいスキャンにはCollectRowsとRowToStructByNameを使用します
- 1回のラウンドトリップで複数のクエリを実行するにはSendBatchを使用します
- スループットの高い大量挿入にはCopyFromを使用します
よくある質問
「pgx:高性能PostgreSQLドライバー」レッスンは無料ですか?
はい。「pgx:高性能PostgreSQLドライバー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「pgx:高性能PostgreSQLドライバー」で何を学びますか?
pgxpool、Copyプロトコル、バッチクエリ ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「pgx:高性能PostgreSQLドライバー」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- database/sqlとドライバー
- sqlx:構造体スキャンと名前付きクエリ
- pgx:高性能PostgreSQLドライバー
- トランザクションとマイグレーション