Pular para o conteúdo

Sistema de Banco de Dados

Pool de conexões e configuração de banco de dados SQL. Suporta PostgreSQL, MySQL e SQLite.

TipoDescrição
db.sql.postgresBanco de dados PostgreSQL
db.sql.mysqlBanco de dados MySQL
db.sql.sqliteBanco de dados SQLite
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" # Use :memory: para em memória
pool:
max_open: 1
max_idle: 1
max_lifetime: "1h"
options:
cache: "shared"
lifecycle:
auto_start: true
CampoTipoDescrição
hoststringEndereço do host do banco de dados
portintNúmero da porta do banco de dados
databasestringNome do banco de dados
usernamestringUsuário do banco de dados
passwordstringSenha do banco de dados
poolobjectConfigurações de pool de conexões
optionsmapOpções específicas do banco de dados
lifecycleobjectConfiguração de ciclo de vida
CampoTipoDescrição
filestringCaminho do arquivo de banco de dados ou :memory:
poolobjectConfigurações de pool de conexões
optionsmapOpções específicas do SQLite
lifecycleobjectConfiguração de ciclo de vida

Use o sufixo _env para carregar valores de variáveis de ambiente ou entradas env.variable:

CampoDescrição
host_envHost de variável de ambiente
port_envPorta de variável de ambiente
database_envNome do banco de dados do ambiente
username_envUsuário do ambiente
password_envSenha do ambiente
- 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" # Referencia entrada env.variable
Evite codificar senhas na configuração. Use variáveis de ambiente ou entradas env.variable para credenciais. Veja Ambiente para gerenciamento seguro de segredos.

Configure o comportamento de pool de conexões. Configurações de pool mapeiam para o pool de conexões database/sql do Go.

CampoTipoPadrãoDescrição
max_openint0Máximo de conexões abertas (0 = ilimitado)
max_idleint0Máximo de conexões ociosas (0 = ilimitado)
max_lifetimeduration1hTempo de vida máximo da conexão
pool:
max_open: 25 # Limita conexões concorrentes
max_idle: 5 # Mantém 5 conexões prontas
max_lifetime: "30m" # Recicla conexões a cada 30 minutos
Defina max_idle menor ou igual a max_open. Conexões excedendo max_lifetime são fechadas e substituídas, ajudando a recuperar de conexões obsoletas.

Cada tipo de banco de dados constrói um DSN a partir da configuração:

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

Opções comuns específicas de cada banco de dados:

options:
sslmode: "require" # disable, require, verify-ca, verify-full
connect_timeout: "10" # Timeout de conexão em segundos
application_name: "myapp"
options:
charset: "utf8mb4"
parseTime: "true" # Analisa valores de tempo para time.Time
loc: "Local" # Fuso horário
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:
# Banco de dados principal
- 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
# Banco de dados de analytics
- 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
# Cache local
- name: cache
kind: db.sql.sqlite
file: "/var/cache/app.db"
lifecycle:
auto_start: true

Bancos de dados podem ser registrados em tempo de execução usando o módulo registry, permitindo configuração dinâmica de banco de dados baseada no estado da aplicação ou configuração externa.

Veja Módulo SQL para API de operações de banco de dados.

  • Módulo SQL - Referência da API Lua
  • Store - Armazenamento chave-valor baseado em database.sql
  • Queue - Handler de fila baseado em SQL