Перейти к содержимому

База данных

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

ТипОписание
db.sql.postgresPostgreSQL
db.sql.mysqlMySQL
db.sql.sqliteSQLite
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
- 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
ПолеТипОписание
hoststringАдрес сервера БД
portintПорт
databasestringИмя базы данных
usernamestringПользователь
passwordstringПароль
poolobjectНастройки пула подключений
optionsmapСпецифичные для БД опции
lifecycleobjectНастройки жизненного цикла
ПолеТипОписание
filestringПуть к файлу БД или :memory:
poolobjectНастройки пула
optionsmapОпции SQLite
lifecycleobjectНастройки жизненного цикла

Суффикс _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_openint0Максимум открытых подключений (0 = без ограничений)
max_idleint0Максимум простаивающих подключений (0 = без ограничений)
max_lifetimeduration1hМаксимальное время жизни подключения
pool:
max_open: 25 # Ограничить параллельные подключения
max_idle: 5 # Держать 5 подключений готовыми
max_lifetime: "30m" # Обновлять подключения каждые 30 минут
Устанавливайте max_idle не больше max_open. Подключения старше max_lifetime закрываются и пересоздаются, что помогает справляться с устаревшими подключениями.

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

postgres://username:password@host:port/database?sslmode=disable
username:password@tcp(host:port)/database?charset=utf8mb4
file:/path/to/database.db?cache=shared
:memory:?mode=memory

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

options:
sslmode: "require" # disable, require, verify-ca, verify-full
connect_timeout: "10" # Тайм-аут подключения в секундах
application_name: "myapp"
options:
charset: "utf8mb4"
parseTime: "true" # Парсить значения времени в time.Time
loc: "Local" # Часовой пояс
options:
cache: "shared" # shared, private
mode: "rwc" # ro, rw, rwc, memory
_journal_mode: "WAL" # DELETE, TRUNCATE, PERSIST, MEMORY, WAL, OFF
- 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
- 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"
- 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, что позволяет динамически настраивать подключения на основе состояния приложения или внешней конфигурации.

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

  • Модуль SQL — справочник Lua API
  • Store — key-value хранилище на основе database.sql
  • Queue — обработчик очередей на основе SQL