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 — локальная установка не требуется.
Все уроки этого курса
- database/sql и драйверы
- sqlx: сканирование структур и именованные запросы
- pgx: высокопроизводительный драйвер PostgreSQL
- Транзакции и миграции