0Pricing
Go Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

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

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