Sistema de Base de Datos

Wippy proporciona entradas SQL con pool de conexiones para PostgreSQL y MySQL, además de una entrada SQLite de una sola conexión.

Esta página es una referencia de configuración. Salvo que un fence incluya version, namespace y entries, trátelo como un fragmento para colocarlo dentro de una lista de entradas existente.

Tipos de Entrada

Tipo Descripción
db.sql.postgres Base de datos PostgreSQL
db.sql.mysql Base de datos MySQL
db.sql.sqlite Base de datos SQLite

Configuración

Bases de Datos Estándar (PostgreSQL, MySQL)

# 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: ${env:app.secrets:db_password}
    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"  # Use :memory: para bases de datos en memoria
    pool:
      max_open: 4
      max_idle: 2
      max_lifetime: "1h"
    lifecycle:
      auto_start: true
Una base de datos SQLite privada en memoria (file: ":memory:") está limitada a una sola conexión física, por lo que max_open y max_idle se fuerzan a 1. Una base de datos respaldada por archivo respeta la configuración de pool establecida, que una transacción de lectura de snapshot CDC necesita para no consumir la única conexión de escritura. El modo de journal siempre es WAL.

Campos de Conexión

Campos de Base de Datos Estándar

Campo Tipo Descripción
host string Dirección del host de base de datos
port int Número de puerto de base de datos
database string Nombre de base de datos
username string Usuario de base de datos
password string Contraseña de base de datos
pool object Configuración del pool de conexiones
options map Opciones específicas de la base de datos
lifecycle object Configuración de ciclo de vida

Campos de SQLite

Campo Tipo Por Defecto Descripción
file string requerido Ruta del archivo de base de datos o :memory:
pool object - Configuración del pool de conexiones; max_open y max_idle se fuerzan a 1 para :memory:
max_mutation_changes int 100000 Filas que una transacción puede retener en el observador de mutaciones confirmadas
max_mutation_bytes int 67108864 Bytes lógicos que una transacción puede retener en el observador (64 MiB)
options map - Aceptado pero ignorado
lifecycle object - Configuración de ciclo de vida

max_mutation_changes y max_mutation_bytes acotan el observador en memoria de mutaciones confirmadas que alimenta una fuente db.cdc.sqlite. Cero en cualquiera de los campos selecciona el valor por defecto; los valores negativos se rechazan. Los límites son conservadores en lugar de exactos: SQLite entrega una fila completa al hook pre-update, por lo que una fila puede materializarse antes de que el límite rechace la candidata.

Valores de Secretos y de Entorno

Obtenga valores de conexión del registro de entorno con placeholders ${env:NAME}, resueltos en tiempo de decodificación. NAME es el nombre público de una variable registrada o su ID de entrada (ej. app.secrets:db_password); no es una variable de entorno cruda del SO.

- 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}
Las configuraciones antiguas usan una directiva hermana <campo>_env (host_env, port_env, database_env, username_env, password_env) que se resuelve de la misma forma. Esta forma está obsoleta — mígrela al placeholder ${env:NAME} mostrado arriba. Evite codificar contraseñas en la configuración. Use entradas env.variable para credenciales. Consulte Entorno para gestión segura de secretos.

Pool de Conexiones

Configure el comportamiento del pool de conexiones. La configuración del pool se mapea al pool de conexiones de database/sql de Go.

Campo Tipo Por Defecto Descripción
max_open int 0 Conexiones máximas abiertas (0 = ilimitado)
max_idle int 0 Conexiones máximas inactivas (0 = no se retienen conexiones inactivas)
max_lifetime duration 1h Tiempo de vida máximo de conexión
pool:
  max_open: 25      # Limit concurrent connections
  max_idle: 5       # Keep 5 connections ready
  max_lifetime: "30m"  # Recycle connections every 30 minutes
Establezca max_idle menor o igual a max_open. Las conexiones que excedan max_lifetime se cierran y reemplazan, ayudando a recuperarse de conexiones obsoletas.

Formatos DSN

Cada tipo de base de datos construye un DSN desde la configuración. Cualquier options se añade (ordenado por clave); ninguna se incluye por defecto.

PostgreSQL {id="dsn-postgresql"}

host='host' port=port user='username' password='password' dbname='database' [option='value' ...]

Todos los valores excepto el puerto van entre comillas simples, y los caracteres ' y \ incrustados se escapan con barra invertida, de modo que hosts, contraseñas y valores de opciones que contengan espacios o comillas se transmiten intactos.

MySQL {id="dsn-mysql"}

username:password@tcp(host:port)/database[?option=value&...]

SQLite {id="dsn-sqlite"}

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

Opciones de Base de Datos

Opciones comunes específicas de base de datos:

PostgreSQL {id="options-postgresql"}

options:
  sslmode: "require"      # disable, require, verify-ca, verify-full
  connect_timeout: "10"   # Connection timeout in seconds
  application_name: "myapp"

MySQL {id="options-mysql"}

options:
  charset: "utf8mb4"
  parseTime: "true"       # Parse time values to time.Time
  loc: "Local"            # Timezone

SQLite {id="options-sqlite"}

SQLite no aplica el mapa options a su DSN. Las bases de datos en archivo siempre se abren con mode=rwc, y el modo de journal siempre se establece en WAL. El campo options se acepta pero se ignora.

Ejemplos

PostgreSQL con SSL

- name: secure_postgres
  kind: db.sql.postgres
  host: "db.example.com"
  port: 5432
  database: "production"
  username: "app_user"
  password: ${env:app.secrets: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

Réplica de Lectura MySQL

- name: mysql_replica
  kind: db.sql.mysql
  host: "replica.db.example.com"
  port: 3306
  database: "app"
  username: "readonly"
  password: ${env:app.secrets:replica_password}
  pool:
    max_open: 20
    max_idle: 5
    max_lifetime: "30m"
  options:
    charset: "utf8mb4"
    parseTime: "true"
    readTimeout: "30s"

SQLite En Memoria

- name: test_db
  kind: db.sql.sqlite
  file: ":memory:"

Configuración de Múltiples Bases de Datos

entries:
  # Primary database
  - name: users_db
    kind: db.sql.postgres
    host: ${env:USERS_DB_HOST}
    port: 5432
    database: "users"
    username: ${env:USERS_DB_USER}
    password: ${env:app.secrets:users_db_password}
    lifecycle:
      auto_start: true

  # Analytics database
  - name: analytics_db
    kind: db.sql.mysql
    host: ${env:ANALYTICS_DB_HOST}
    port: 3306
    database: "analytics"
    username: ${env:ANALYTICS_DB_USER}
    password: ${env:app.secrets:analytics_db_password}
    lifecycle:
      auto_start: true

  # Local cache
  - name: cache
    kind: db.sql.sqlite
    file: "/var/cache/app.db"
    lifecycle:
      auto_start: true

Registro en Tiempo de Ejecución

Las bases de datos pueden registrarse en tiempo de ejecución mediante el módulo registry.

API Lua

Consulte el módulo SQL para las operaciones de consulta, transacción y conexión.

Ver También

  • Módulo SQL - Referencia de la API Lua
  • Store - Almacén clave-valor respaldado por una base de datos db.sql.*
  • Queue - Handler de cola respaldado por SQL
  • Change Data Capture - Transmisión de cambios a nivel de fila desde una base de datos db.sql.sqlite o Postgres