RSS Telegram YouTube Apple Яндекс Spotify Google Amazon Почта

14. pgx

26.08.2023

Скачать

К списку выпусков

Сегодня мы говорим о драйвере базы данных pgx. Почему мы не используем pq в наших проектах на Go? Когда стоит использовать database/sql из стандартной библиотеки, а когда лучше работать напрямую с драйвером и почему мы не используем database/sql? Поговорили про функционал pgx позволяющий использовать LISTEN/NOTIFY, т.е. межпроцессное взаимодействие (IPC) на базе PostgreSQL. Коснулись работы с LOB и темы хранения файлов в БД. Поговорили про новую систему логгирования в pgx5 с использованием механизма трейсинга и про пул соединений.

pgx - активно поддерживаемый драйвер для работы с PostgreSQL Джеком Кристенсеном (Jack Christensen, jackc).

pgx provides lower level access to PostgreSQL than the standard database/sql. It remains as similar to the database/sql interface as possible while providing better speed and access to PostgreSQL specific features.

pgx можно использовать для работы как с PostgreSQL, так и с CockroachDB (СУБД, нацеленная на легкость горизонтального масштабирования).

Почти все мои проекты используют 4 версию этого драйвера, хотя уже почти год как (сентябрь 2022) вышла 5 версия. Я как раз выкроил время на ознакомление с ченджлогом свежих версий и планирую перевести все проекты на 5ую версию. Благо сделать это несложно, т.к. по интерфейсной части все осталось прежним. Заметное изменение - это объединение нескольких репозиториев (pgtype, pgconn и pgproto3) в один, в pgx.

Логгирование в 5 версиии заменено на трейсинг и предоставлены адаптеры для обратной совместимости с логгированием, как оно было реализовано в 4ой версии. Трейсинг в 5 версии (tracer.go) предлагает несколько интерфейсов: QueryTracer, BatchTracer, CopyFromTracer, PrepareTracer и ConnectTracer. У каждого такого интерфейса по два метода: *Start и *End. Первый запускается с аргументами соответсвующей функции, а второй с результатами её выполнения. Благодаря такому подходу можно подключить через opentelemetry экспорт вызовов не только в логи, но и в трейсинг-платформу, например Jaeger.

pgx можно использовать также и опосредованно, через интерфейсы, которые предоставляет Go SDK. Т.к. это интерфейс, то вы сможете легче сменить СУБД или конкретный драйвер, если не будете вытаскивать pgx.Conn и уже работать напрямую с pgx.

LISTEN/NOTIFY - это простой механизм для inter-process коммуникаций, для отправки уведомлений в реальном времени. Например, на вставку в таблицу можно навесить триггер, который будет отправлять данные новой записи через NOTIFY, а слушающий процесс обрабатывать эти данные. Из интересных особенностей NOTIFY: отправка данные в канал происходит только, если транзакция, в которой происходит вызов NOTIFY закончилась успешно.

Работа с большими объектами (Large Objects). Преимущества: хранение до 4Тб (TOAST до 1Гб), эффективное чтение и запись: LOB имплементирует Reader и Writer интерфейсы. Работа с LOBом чем-то напоминает работу с файлом (Read, Write, Seek).

RowScanner интерфейс для вынесения логики сканирования результатов выполненеия запроса и наполнение структуры данными. Благодаря новым методам CollectRows, CollectOneRow и ForEachRow выборки можно делать намного эффективнее.

pgxpool очень компактна по коду, т.к. использует generic-библиотеки puddle для менеджмента блокировки ресурса.

К списку выпусков