Психанул на неудобный драйвер pgx и написал свою библиотеку. Все как по канонам гошников ) — Golang

от автора

Проблема, которую решает pgxWrappy

Как разработчик на Go, я долгое время использовал pgx — безусловно, лучший драйвер для PostgreSQL. Но каждый раз, когда нужно было сканировать результаты запроса в структуры, особенно со сложной вложенностью, приходилось писать много шаблонного кода. Это отнимало время и делало код менее читаемым.

После десятков проектов с pgx я решил создать решение, которое сохраняет все преимущества оригинального драйвера, но избавляет от рутинных операций.

Ключевые возможности pgxWrappy

1. Интуитивное сканирование результатов

Больше не нужно вручную перебирать строки и вызывать Scan():

// Вместо этого: rows, _ := conn.Query(ctx, "SELECT id, name FROM users") defer rows.Close() var users []User for rows.Next() {     var u User     rows.Scan(&u.ID, &u.Name)     users = append(users, u) }  // Делаем так: var users []User db.Select(ctx, &users, "SELECT id, name FROM users") 

2. Поддержка сложных структур

Работа с вложенными структурами становится простой:

type Address struct {     City   string `db:"city"`     Street string `db:"street"` }  type User struct {     ID      int     `db:"id"`     Name    string  `db:"name"`     Address Address `db:"address"` // Автоматическое сканирование вложенной структуры }  // Запрос должен содержать поля address_city и address_street db.Get(ctx, &user, "SELECT id, name, city as address_city, street as address_street FROM users WHERE id=$1", 1) 

3. Гибкие варианты именования полей

Поддерживаются разные стили тегов:

type User struct {     UserID  int    `db:"user_id"`  // явное указание имени столбца     Name    string `db:"name"`     // простое соответствие     Email   string                // если тег отсутствует, используется имя поля в snake_case     Address Address `db:"-"`       // игнорирование поля при сканировании } 

4. Полноценная работа с транзакциями

Упрощенное управление транзакциями:

tx, err := db.Begin(ctx) if err != nil {     return err } defer tx.Rollback(ctx)  // Работаем как с обычным wrapper'ом err = tx.Exec(ctx, "UPDATE accounts SET balance = balance - $1 WHERE id = $2", amount, fromID) err = tx.Exec(ctx, "UPDATE accounts SET balance = balance + $1 WHERE id = $2", amount, toID)  return tx.Commit(ctx) 

Производительность

pgxWrappy добавляет минимальные накладные расходы по сравнению с чистым pgx. В тестах на сканирование 10,000 строк разница составляет менее 5%. Это плата за удобство, которое во многих случаях окупается сокращением времени разработки.

Когда стоит использовать?

pgxWrappy идеально подходит для:

  • Проектов, где важна чистота и читаемость кода

  • Приложений со сложными domain-моделями

  • Команд, которые хотят сократить boilerplate-код

  • Разработчиков, переходящих с database/sql на pgx

Установка и начало работы

go get -u github.com/Arlandaren/pgxWrappy 

Пример подключения:

import (     "context"     "github.com/jackc/pgx/v5/pgxpool"     "github.com/Arlandaren/pgxWrappy/pkg/postgres" )  func main() {     ctx := context.Background()     pool, _ := pgxpool.New(ctx, "postgres://user:pass@localhost:5432/db")     db := pgxwrappy.NewWrapper(pool)          // Готово к работе! } 

Сообщество и вклад

Проект активно развивается. Приветствуются:

  • Отзывы и предложения

  • Bug reports

  • Pull requests

  • Примеры использования из реальных проектов

⭐ Поддержите проект звездой на GitHub: https://github.com/Arlandaren/pgxWrappy

Альтернативы и сравнение

Особенность

pgx (чистый)

pgxWrappy

database/sql

GORM

Производительность

⭐⭐⭐⭐⭐

⭐⭐⭐⭐

⭐⭐⭐

⭐⭐

Удобство работы

⭐⭐

⭐⭐⭐⭐⭐

⭐⭐

⭐⭐⭐⭐

Сложные структуры

⭐⭐⭐⭐⭐

⭐⭐⭐⭐

Контроль запросов

⭐⭐⭐⭐⭐

⭐⭐⭐⭐

⭐⭐⭐⭐

⭐⭐

PostgreSQL фичи

⭐⭐⭐⭐⭐

⭐⭐⭐⭐

⭐⭐

⭐⭐

pgxWrappy занимает идеальную нишу между чистым pgx и тяжелыми ORM, предлагая баланс производительности и удобства.

Попробуйте pgxWrappy в своем следующем проекте и ощутите разницу! Ваши звёзды и отзывы помогут сделать библиотеку лучше для всего Go-сообщества.


ссылка на оригинал статьи https://habr.com/ru/articles/931248/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *