Для работы с SQL
базами в Go существует библиотека database/sql
.
Эта библиотека предоставляет базовый интерфейс для работы с любой БД, но для каждой конкретной базы, например MySQL
, PostgreSQL
, MSSQL
и т.д., лучше использовать конкретный драйвер.
Для PostgreSQL
самым распросторенным драйвером был github.com/lib/pq
, но сегодня он потерял свою актуальность и ему на смену пришел github.com/jackc/pgx
.
pgx
стремится быть низкоуровневым, быстрым и производительным, а также позволяет использовать специфические для PostgreSQL
функции, которые не допускаются в стандартном пакете database/sql
.
Для начала установим нужные зависимости:
go get -u github.com/jackc/pgx/v4
go get -u github.com/jackc/pgx/v4/pgxpool
А дальше рассмотрим пример подключения к БД:
package main
import (
"context"
"fmt"
"net/url"
"os"
"github.com/jackc/pgx/v4/pgxpool"
)
func main() {
connStr := fmt.Sprintf("%s://%s:%s@%s:%s/%s?sslmode=disable&connect_timeout=%d",
"postgres",
url.QueryEscape("db_user"),
url.QueryEscape("db_pass"),
"localhost",
"5432",
"db_name",
5)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
poolConfig, err := pgxpool.ParseConfig(connStr)
if err != nil {
fmt.Fprintf(os.Stderr, "Create pool failed: %v\n", err)
os.Exit(1)
}
poolConfig.MaxConns = 20
poolConfig.MinConns = 5
pool, err := pgxpool.ConnectConfig(ctx, poolConfig)
if err != nil {
fmt.Fprintf(os.Stderr, "Connect to database failed: %v\n", err)
os.Exit(1)
}
fmt.Println("Connection OK!")
err = pool.Ping(ctx)
if err != nil {
fmt.Fprintf(os.Stderr, "Ping failed: %v\n", err)
os.Exit(1)
}
fmt.Println("Query OK!")
pool.Close(ctx)
}
connStr
- это стандартный способ передачи параметров подключения драйверу, используемый в разных библиотеках для разных языков для подключения к PostgreSQL
.
Как можно заметить мы передаем название протокола, имя и пароль пользователя и, конечно, имя базы.
Параметров подключения существует много и с полным списком лучше ознакомится в документации PostgreSQL
.
*pgx.Conn
представляет одно соединение с базой данных и не является безопасным для параллелизма.
Но разработчики предоставлояют подпакет github.com/jackc/pgx/v4/pgxpool
для безопасного пула соединений с параллелизмом.
Вместо использования pgx.Connect()
мы сразу используем пул соединений и настраиваем его через поля MaxConns
и MinConns
.
Ping()
выполняет пустой оператор SQL
для *Conn
.
Если SQL
возвращается без ошибок, Ping()
базы данных считается успешным, в противном случае возвращается ошибка.
Ну и метод Close()
закрывает соединение с базой.