База данных

Пулы подключений к SQL-базам данных. Поддерживаются PostgreSQL, MySQL, SQLite, Microsoft SQL Server и Oracle.

Типы записей

Тип Описание
db.sql.postgres PostgreSQL
db.sql.mysql MySQL
db.sql.sqlite SQLite
db.sql.mssql Microsoft SQL Server
db.sql.oracle Oracle

Настройка

Стандартные базы данных (PostgreSQL, MySQL, MSSQL, Oracle)

# src/data/_index.yaml
version: "1.0"
namespace: app.data

entries:
  - name: main_db
    kind: db.sql.postgres
    host: "localhost"
    port: 5432
    database: "myapp"
    username: "dbuser"
    password: "dbpass"
    pool:
      max_open: 25
      max_idle: 5
      max_lifetime: "1h"
    options:
      sslmode: "disable"
    lifecycle:
      auto_start: true

SQLite

  - name: cache_db
    kind: db.sql.sqlite
    file: "/var/data/cache.db"  # Для in-memory используйте :memory:
    pool:
      max_open: 1
      max_idle: 1
      max_lifetime: "1h"
    options:
      cache: "shared"
    lifecycle:
      auto_start: true

Поля подключения

Стандартные поля

Поле Тип Описание
host string Адрес сервера БД
port int Порт
database string Имя базы данных
username string Пользователь
password string Пароль
pool object Настройки пула подключений
options map Специфичные для БД опции
lifecycle object Настройки жизненного цикла

Поля SQLite

Поле Тип Описание
file string Путь к файлу БД или :memory:
pool object Настройки пула
options map Опции SQLite
lifecycle object Настройки жизненного цикла

Поля из переменных окружения

Суффикс _env позволяет загружать значения из переменных окружения или записей env.variable:

Поле Описание
host_env Хост из переменной окружения
port_env Порт из переменной окружения
database_env Имя БД из переменной окружения
username_env Пользователь из переменной окружения
password_env Пароль из переменной окружения
- name: prod_db
  kind: db.sql.postgres
  host_env: "DB_HOST"
  port_env: "DB_PORT"
  database_env: "DB_NAME"
  username_env: "DB_USER"
  password_env: "app.secrets:db_password"  # Ссылка на запись env.variable
Не храните пароли в конфигурации напрямую. Используйте переменные окружения или записи env.variable для учётных данных. См. Окружение для безопасного хранения секретов.

Пул подключений

Настройка поведения пула. Параметры соответствуют пулу подключений database/sql в Go.

Поле Тип По умолчанию Описание
max_open int 0 Максимум открытых подключений (0 = без ограничений)
max_idle int 0 Максимум простаивающих подключений (0 = без ограничений)
max_lifetime duration 1h Максимальное время жизни подключения
pool:
  max_open: 25      # Ограничить параллельные подключения
  max_idle: 5       # Держать 5 подключений готовыми
  max_lifetime: "30m"  # Обновлять подключения каждые 30 минут
Устанавливайте max_idle не больше max_open. Подключения старше max_lifetime закрываются и пересоздаются, что помогает справляться с устаревшими подключениями.

Форматы DSN

Для каждого типа БД формируется свой DSN из конфигурации:

PostgreSQL {id="dsn-postgresql"}

postgres://username:password@host:port/database?sslmode=disable

MySQL {id="dsn-mysql"}

username:password@tcp(host:port)/database?charset=utf8mb4

SQLite {id="dsn-sqlite"}

file:/path/to/database.db?cache=shared
:memory:?mode=memory

Microsoft SQL Server {id="dsn-mssql"}

sqlserver://username:password@host:port?database=dbname

Oracle {id="dsn-oracle"}

oracle://username:password@host:port/service_name

Опции баз данных

Типичные опции для разных БД:

PostgreSQL {id="options-postgresql"}

options:
  sslmode: "require"      # disable, require, verify-ca, verify-full
  connect_timeout: "10"   # Тайм-аут подключения в секундах
  application_name: "myapp"

MySQL {id="options-mysql"}

options:
  charset: "utf8mb4"
  parseTime: "true"       # Парсить значения времени в time.Time
  loc: "Local"            # Часовой пояс

SQLite {id="options-sqlite"}

options:
  cache: "shared"         # shared, private
  mode: "rwc"            # ro, rw, rwc, memory
  _journal_mode: "WAL"   # DELETE, TRUNCATE, PERSIST, MEMORY, WAL, OFF

Microsoft SQL Server {id="options-mssql"}

options:
  encrypt: "true"
  TrustServerCertificate: "false"

Oracle {id="options-oracle"}

options:
  poolMinSessions: "1"
  poolMaxSessions: "10"
  poolIncrement: "1"

Примеры

PostgreSQL с SSL

- name: secure_postgres
  kind: db.sql.postgres
  host: "db.example.com"
  port: 5432
  database: "production"
  username: "app_user"
  password: "${DB_PASSWORD}"
  pool:
    max_open: 50
    max_idle: 10
    max_lifetime: "1h"
  options:
    sslmode: "verify-full"
    sslcert: "/certs/client.crt"
    sslkey: "/certs/client.key"
    sslrootcert: "/certs/ca.crt"
  lifecycle:
    auto_start: true

MySQL реплика для чтения

- name: mysql_replica
  kind: db.sql.mysql
  host: "replica.db.example.com"
  port: 3306
  database: "app"
  username: "readonly"
  password_env: "REPLICA_PASSWORD"
  pool:
    max_open: 20
    max_idle: 5
    max_lifetime: "30m"
  options:
    charset: "utf8mb4"
    parseTime: "true"
    readTimeout: "30s"

SQLite в памяти

- name: test_db
  kind: db.sql.sqlite
  file: ":memory:"
  pool:
    max_open: 1
    max_idle: 1
  options:
    cache: "shared"
    mode: "memory"

Несколько баз данных

entries:
  # Основная база
  - name: users_db
    kind: db.sql.postgres
    host_env: "USERS_DB_HOST"
    port: 5432
    database: "users"
    username_env: "USERS_DB_USER"
    password_env: "USERS_DB_PASSWORD"
    lifecycle:
      auto_start: true

  # Аналитика
  - name: analytics_db
    kind: db.sql.mysql
    host_env: "ANALYTICS_DB_HOST"
    port: 3306
    database: "analytics"
    username_env: "ANALYTICS_DB_USER"
    password_env: "ANALYTICS_DB_PASSWORD"
    lifecycle:
      auto_start: true

  # Локальный кеш
  - name: cache
    kind: db.sql.sqlite
    file: "/var/cache/app.db"
    lifecycle:
      auto_start: true

Регистрация во время работы

Базы данных можно регистрировать во время работы через модуль registry, что позволяет динамически настраивать подключения на основе состояния приложения или внешней конфигурации.

Lua API

См. Модуль SQL для API работы с базами данных.