0Pricing
Go Academy · Урок

database/sql и драйверы

Настройка DB, QueryRow, Scan и пулы соединений

«database/sql и драйверы» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Обзор database/sql

database/sql — стандартный уровень абстракции баз данных в Go. Он управляет пулом соединений и работает с любой базой данных через подключаемый плагин-драйвер.

Регистрация драйвера

Импортируйте пакет драйвера ради побочных эффектов (регистрации драйвера). Затем откройте соединение:

import _ "github.com/lib/pq" // PostgreSQL driver

db, err := sql.Open("postgres", "postgres://user:pass@localhost/mydb?sslmode=disable")
if err != nil { log.Fatal(err) }
defer db.Close()

sql.Open и db.Ping

sql.Open не устанавливает соединение — он проверяет DSN. Вызовите db.Ping() или db.PingContext(ctx), чтобы убедиться, что соединение активно.

if err := db.Ping(); err != nil { log.Fatal(err) }

Запрос строк

Используйте db.QueryContext, чтобы выполнить SELECT и просканировать строки:

rows, err := db.QueryContext(ctx, "SELECT id, name FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()
for rows.Next() {
    var id int; var name string
    rows.Scan(&id, &name)
}

Запрос одной строки

db.QueryRowContext возвращает *Row для запросов, которые должны вернуть не более одного результата:

var name string
err := db.QueryRowContext(ctx, "SELECT name FROM users WHERE id = $1", id).Scan(&name)
if errors.Is(err, sql.ErrNoRows) { /* not found */ }

Выполнение изменений

Используйте db.ExecContext для INSERT, UPDATE и DELETE. Он возвращает Result с количеством затронутых строк и последним ID вставленной записи.

result, err := db.ExecContext(ctx, "INSERT INTO users(name) VALUES($1)", name)
if err != nil { return err }
id, _ := result.LastInsertId()

Подготовленные запросы

Подготовьте запрос один раз и эффективно выполняйте его много раз:

stmt, err := db.PrepareContext(ctx, "SELECT id FROM users WHERE email = $1")
defer stmt.Close()
for _, email := range emails {
    row := stmt.QueryRowContext(ctx, email)
}

Настройки пула соединений

Настройте пул для рабочей среды:

db.SetMaxOpenConns(25)
db.SetMaxIdleConns(25)
db.SetConnMaxLifetime(5 * time.Minute)

Проверка rows.Err()

После цикла по строкам всегда проверяйте rows.Err() — цикл мог завершиться раньше времени из-за ошибки сети.

if err := rows.Err(); err != nil { return err }

Значения NULL

Используйте sql.NullString, sql.NullInt64 и другие подобные типы для обработки значений NULL из базы данных, которые иначе вызвали бы панику при сканировании в тип Go, не являющийся указателем.

var bio sql.NullString
rows.Scan(&bio)
if bio.Valid { fmt.Println(bio.String) }

Список драйверов

Популярные драйверы: github.com/lib/pq (PostgreSQL), github.com/go-sql-driver/mysql (MySQL), modernc.org/sqlite (SQLite, чистый Go).

Быстрая проверка

Почему после запроса необходимо всегда вызывать rows.Close() и проверять rows.Err()?

Итоги: database/sql

Основные моменты:

  • Импортируйте драйвер с помощью _ ради побочных эффектов; sql.Open + Ping
  • QueryContext → rows.Next + Scan + rows.Close + rows.Err
  • ExecContext для изменений; QueryRowContext для одной строки
  • SetMaxOpenConns, SetMaxIdleConns, SetConnMaxLifetime для пула

Часто задаваемые вопросы

Урок «database/sql и драйверы» бесплатный?

Да — полный текст урока «database/sql и драйверы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «database/sql и драйверы»?

Настройка DB, QueryRow, Scan и пулы соединений Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «database/sql и драйверы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. database/sql и драйверы
  2. sqlx: сканирование структур и именованные запросы
  3. pgx: высокопроизводительный драйвер PostgreSQL
  4. Транзакции и миграции
← Назад к Go Academy