Какие пакеты используются в Go для работы с PostgreSQL? В чем их ключевые различия?

Ответ

Для работы с PostgreSQL в Go используется стандартный интерфейс database/sql в связке со сторонним драйвером. Основные драйверы — это pgx и lib/pq.

pgx — современный и наиболее рекомендуемый драйвер.

  • Преимущества: Высокая производительность, активная разработка, полная поддержка типов данных PostgreSQL (JSONB, массивы, hstore), а также возможность работы как через нативный интерфейс, так и в качестве драйвера для database/sql.
  • Рекомендация: Является стандартом де-факто для новых проектов.
// Использование pgx с database/sql (рекомендуемый подход)
import (
    "database/sql"
    _ "github.com/jackc/pgx/v5/stdlib"
)

func main() {
    db, err := sql.Open("pgx", "postgres://user:password@localhost:5432/database_name")
    if err != nil {
        // handle error
    }
    defer db.Close()
}

lib/pq — более старый и широко известный драйвер.

  • Особенности: Стабильный и простой, но находится в режиме поддержки (новые функции не добавляются). Уступает pgx в производительности и поддержке специфичных для PostgreSQL возможностей.
  • Рекомендация: Подходит для поддержки старых проектов, но для новых лучше выбрать pgx.
import (
    "database/sql"
    _ "github.com/lib/pq"
)

func main() {
    db, err := sql.Open("postgres", "postgres://user:password@localhost:5432/database_name?sslmode=disable")
    if err != nil {
        // handle error
    }
    defer db.Close()
}

Итог: Для новых приложений всегда выбирайте pgx из-за его производительности, функциональности и активной поддержки.

Ответ 18+ 🔞

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

Так вот, стандартная библиотека Go, database/sql, — это как бы универсальный пульт, а драйвер — это батарейки к нему. Без драйвера — просто кусок пластика. Основных претендентов на роль этих самых батареек — два: pgx и lib/pq.

pgx — это, сука, новое поколение, шустрый такой, наглый.

  • Что он из себя представляет? Это как взять спортивный автомобиль и засунуть ему под капот реактивный двигатель. Высокая производительность, разработчики его постоянно пилят и улучшают, и он понимает все эти ваши постгресовские приколы: JSONB, массивы, hstore — всё это ему по зубам. И главное — он может работать в двух режимах: как нативный монстр, так и через стандартный database/sql, что очень удобно.
  • Что я думаю? Это сейчас стандарт де-факто. Если начинаешь новый проект и не взял pgx — ты, прости, мудак. Серьёзно.
// Берём pgx и втыкаем его в стандартный sql (самый разумный путь)
import (
    "database/sql"
    _ "github.com/jackc/pgx/v5/stdlib" // Вот эта магия подключает драйвер
)

func main() {
    // "pgx" — это и есть имя драйвера для sql.Open
    db, err := sql.Open("pgx", "postgres://user:password@localhost:5432/my_db")
    if err != nil {
        // ну тут понятно, если ошибка — надо что-то делать, а не игнорировать
    }
    defer db.Close() // не забудь закрыть, а то ресурсы потекут
}

lib/pq — это старый, добрый дедушка.

  • Что с ним не так? Он стабильный, его все знают, но он, блядь, впал в спячку. Новых фич ему уже не добавляют, только баги чинят. По скорости он отстаёт от pgx, и со всякими навороченными типами данных у него могут быть танцы с бубном.
  • Когда его использовать? Ну, если поддерживаешь легаси-проект, который на нём уже построен. А для нового — да иди ты нахуй со своим lib/pq, бери pgx и не парься.
import (
    "database/sql"
    _ "github.com/lib/pq" // Старый добрый, но уже не тот
)

func main() {
    // Обрати внимание, имя драйвера тут "postgres", а не "pgx"
    db, err := sql.Open("postgres", "postgres://user:password@localhost:5432/my_db?sslmode=disable")
    if err != nil {
        // handle error
    }
    defer db.Close()
}

Итог, ёпта: Не будь консервативной жопой. Для всего нового — только pgx. Производительность, фичи, поддержка — всё на высоте. Выбор-то, в общем-то, очевидный, как хуй в бане.