Подключение PostgreSQL в Go через pgx

6 минут чтения
Средний рейтинг статьи — 4.8

Библиотека pgx — это один из самых быстрых и функциональных драйверов PostgreSQL для Go. В отличие от стандартной библиотеки database/sql, pgx даёт больше контроля, поддержку новых возможностей PostgreSQL и лучшую производительность. Эта статья покажет, как подключиться к базе данных через pgx, выполнить простые запросы и правильно управлять соединением.

Почему именно pgx

  • Написан специально под PostgreSQL — без абстракций под другие БД
  • Поддерживает context, CopyFrom, listen/notify, JSONB и другие фичи
  • Работает как с pgx.Conn, так и через адаптацию под database/sql
  • Эффективный пул соединений без внешних библиотек

Установка pgx

В проекте Go модуля установим нужный пакет:

go get github.com/jackc/pgx/v5

Если планируется использование с database/sql:

go get github.com/jackc/pgx/v5/stdlib

Подключение напрямую через pgx.Conn

Этот способ подойдёт, если вам нужен прямой контроль над соединением и вы не планируете использовать пул:

package main
 
import (
	"context"
	"fmt"
	"log"
 
	"github.com/jackc/pgx/v5"
)
 
func main() {
	// Устанавливаем соединение с базой данных
	conn, err := pgx.Connect(context.Background(), "postgres://user:password@localhost:5432/mydb")
	if err != nil {
		log.Fatal("не удалось подключиться к БД:", err)
	}
	defer conn.Close(context.Background())
 
	// Выполняем простой SQL-запрос
	var greeting string
	err = conn.QueryRow(context.Background(), "SELECT 'Привет от PostgreSQL!'").Scan(&greeting)
	if err != nil {
		log.Fatal(err)
	}
 
	// Выводим результат
	fmt.Println(greeting)
}

В этом примере создаётся подключение к БД, выполняется запрос SELECT, и результат выводится в консоль. Используется метод QueryRow, так как ожидается только одна строка результата.

Использование пула соединений

Для продакшн-приложений правильнее использовать пул соединений — pgxpool. Это позволяет эффективно распределять ресурсы и переиспользовать соединения:

import (
	"context"
	"log"
	"fmt"
	"github.com/jackc/pgx/v5/pgxpool"
)
 
func main() {
	// Создание пула соединений
	pool, err := pgxpool.New(context.Background(), "postgres://user:password@localhost:5432/mydb")
	if err != nil {
		log.Fatal(err)
	}
	defer pool.Close()
 
	// Выполняем запрос: считаем количество пользователей
	row := pool.QueryRow(context.Background(), "SELECT COUNT(*) FROM users")
	var count int
	if err := row.Scan(&count); err != nil {
		log.Fatal(err)
	}
 
	fmt.Println("Пользователей в системе:", count)
}

Здесь pgxpool.New создаёт пул соединений. С помощью QueryRow выполняется агрегатный запрос, результат которого читается в переменную count.

Пример с передачей параметров

Библиотека pgx поддерживает безопасную передачу параметров в запросах:

var name string
err := conn.QueryRow(context.Background(),
  "SELECT name FROM users WHERE id=$1",
  42,
).Scan(&name)

Такой подход защищает от SQL-инъекций. В запросе используется плейсхолдер $1, а значение 42 передаётся отдельно. Это безопасно и корректно.

Заключение

pgx — это надёжный, современный способ работы с PostgreSQL в Go. Он даёт производительность, низкоуровневый контроль и богатый функционал. Если вы строите production-приложение с PostgreSQL, стоит сразу начать с pgx и использовать его пул соединений.

6 минут чтения
Средний рейтинг статьи — 4.8

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний