Ответ
Для работы с 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. Производительность, фичи, поддержка — всё на высоте. Выбор-то, в общем-то, очевидный, как хуй в бане.