Проблема, которую решает 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/
Добавить комментарий