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