pgx для PostgreSQL
Тема дорожной карты · Golang
pgx — наиболее полнофункциональный и производительный драйвер PostgreSQL для Go, предоставляющий как низкоуровневый драйвер pgx/v5, так и пул соединений pgxpool, рекомендуемый для любого продакшен Golang-сервиса, работающего с PostgreSQL. В отличие от обобщённого интерфейса database/sql, pgx предоставляет PostgreSQL-специфичные типы — pgtype.UUID, pgtype.Timestamptz, массивы, JSON/JSONB — без конвертации через строку, делая pgx значительно быстрее для интенсивных по данным бэкендов. Пул создаётся через pgxpool.New(ctx, connString), запросы выполняются с pool.QueryRow(ctx, sql, args...) и последующим pgx.CollectRows или pgxscan для сканирования структур, а pgx.BeginTx управляет явными транзакциями с безопасностью отката через defer tx.Rollback(ctx). pgx поддерживает массовые вставки COPY FROM через conn.CopyFrom, подготовленные запросы, кешируемые в течение жизни пула, и LISTEN/NOTIFY для паттернов pub-sub — возможности, отсутствующие в более простых Golang-библиотеках баз данных. Инструменты миграций баз данных Go вроде golang-migrate напрямую интегрируются с pgx, а трассировка OpenTelemetry может быть добавлена через пакет инструментации otelpgx.
Как это работает
pgx для PostgreSQL использует database/sql (интерфейс) + драйвер (pgx для Postgres — также экспонирует свой native-API, go-sql-driver/mysql для MySQL, mattn/go-sqlite3 для SQLite). Connection pool встроен в database/sql. ORM: GORM (популярный, full-featured, opinionated), Ent (Facebook, code-gen based), Bun (sqlx-like), sqlx (расширяет stdlib). Для миграций: golang-migrate, goose, atlas.
Когда применять
По умолчанию сырой database/sql + sqlx для явных запросов; ORM (GORM, Ent) — только если команда реально хочет. pgx напрямую (pgxpool) — для Postgres: лучшая производительность + Postgres-специфика (массивы, JSONB, COPY). Всегда параметризованные запросы ($1/? placeholders). Миграции — через тул, не через Go-код.
Типичные ошибки
Ловушки pgx для PostgreSQL: SQL-инъекция через fmt.Sprintf в запрос (всегда параметризуйте); утечка *sql.Rows (всегда defer rows.Close()); магия GORM прячет N+1 запросы; не выставлен db.SetMaxOpenConns — исчерпание соединений Postgres; context.Background() вместо контекста запроса (запросы нельзя отменить).