Подключение PostgreSQL в Go через pgx
Библиотека 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 и использовать его пул соединений.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний