Открытие соединения
Подключайтесь к базе данных
«Открытие соединения» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Пакет database/sql
Стандартный пакет Go database/sql предоставляет универсальный API, не зависящий от конкретной базы данных. Используйте его вместе с драйвером нужной базы данных, например PostgreSQL или MySQL.
- Один API для множества баз данных
- Встроенный пул соединений
- Безопасные параметризованные запросы
Импорт драйвера
Драйвер регистрирует себя с помощью импорта с пустым идентификатором. Символ подчёркивания означает, что пакет импортируется только ради побочного эффекта — регистрации, а не для непосредственного вызова.
import (
"database/sql"
_ "github.com/lib/pq"
)sql.Open
sql.Open принимает имя драйвера и имя источника данных (DSN). Фактическое подключение выполняется не сразу: этот вызов лишь подготавливает пул.
db, err := sql.Open("postgres", "postgres://user:pass@localhost/mydb?sslmode=disable")
if err != nil {
log.Fatal(err)
}db — это пул
Возвращённый объект *sql.DB — не отдельное соединение, а пул соединений, безопасный для одновременного использования множеством горутин. Откройте его один раз и используйте во всём приложении.
Проверка с помощью Ping
Так как Open выполняет подключение отложенно, используйте Ping, чтобы действительно установить соединение и убедиться, что база данных доступна, а учётные данные верны.
if err := db.Ping(); err != nil {
log.Fatal("cannot reach db:", err)
}Закрытие пула
Добавьте db.Close() в defer главной функции или функции настройки. Обычно пул закрывают не после каждого запроса, а только при завершении работы всего приложения.
defer db.Close()Настройка пула
Управляйте пулом с помощью SetMaxOpenConns, SetMaxIdleConns и SetConnMaxLifetime. Эти параметры предотвращают исчерпание ресурсов базы данных и заменяют устаревшие соединения.
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(5 * time.Minute)Рабочий пример в памяти
Настоящим драйверам нужна сетевая база данных, поэтому этот рабочий пример показывает тот же жизненный цикл с имитацией открытия и проверки соединения, используя только типы стандартной библиотеки.
package main
import (
"errors"
"fmt"
)
type DB struct{ dsn string }
func Open(driver, dsn string) (*DB, error) {
if dsn == "" {
return nil, errors.New("empty dsn")
}
return &DB{dsn: dsn}, nil
}
func (db *DB) Ping() error { return nil }
func (db *DB) Close() error { return nil }
func main() {
db, err := Open("postgres", "postgres://localhost/mydb")
if err != nil {
fmt.Println("open error:", err)
return
}
defer db.Close()
if err := db.Ping(); err != nil {
fmt.Println("ping error:", err)
return
}
fmt.Println("connected to", db.dsn)
}Варианты с поддержкой контекста
Предпочитайте PingContext, QueryContext и ExecContext, чтобы вызовы учитывали крайние сроки и отмену. Передача контекста ограничивает время, в течение которого зависший вызов к базе данных может блокировать выполнение.
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
err := db.PingContext(ctx)Формат DSN
Каждый драйвер определяет собственный формат DSN. PostgreSQL принимает URL, а MySQL использует user:pass@tcp(host:3306)/dbname. Всегда проверяйте документацию драйверов и не встраивайте учётные данные в код.
Один долгоживущий пул
Распространённая ошибка — вызывать sql.Open для каждого запроса. Это лишает смысла пул соединений и приводит к их исчерпанию. Откройте пул один раз при запуске, сохраните *sql.DB и используйте его повсюду.
Проверка знаний
Проверьте свои знания о соединениях.
Итоги
Вы изучили открытие соединения:
- Импортируйте драйвер с пустым идентификатором и вызовите sql.Open с именем драйвера и DSN
*sql.DB— безопасный для параллельного доступа пул, открываемый один раз- Ping проверяет фактическое соединение
- Настраивайте пул и используйте методы, поддерживающие контекст
- Вызывайте defer db.Close() при завершении работы
Часто задаваемые вопросы
Урок «Открытие соединения» бесплатный?
Да — полный текст урока «Открытие соединения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Открытие соединения»?
Подключайтесь к базе данных Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Открытие соединения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Открытие соединения
- Запрос строк
- Подготовленные операторы
- Транзакции