0Pricing
Go Academy · Урок

Открытие соединения

Подключайтесь к базе данных

«Открытие соединения» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Открытие соединения
  2. Запрос строк
  3. Подготовленные операторы
  4. Транзакции
← Назад к Go Academy