Datenbanksystem

Wippy stellt gepoolte SQL-Datenbankeinträge für PostgreSQL und MySQL sowie einen SQLite-Eintrag mit einer einzelnen Verbindung bereit.

Diese Seite ist eine Konfigurationsreferenz. Wenn ein Block nicht version, namespace und entries enthält, behandeln Sie ihn als Fragment für eine bestehende Entry-Liste.

Entry-Typen

Art Beschreibung
db.sql.postgres PostgreSQL-Datenbank
db.sql.mysql MySQL-Datenbank
db.sql.sqlite SQLite-Datenbank

Konfiguration

Standard-Datenbanken (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: for in-memory
    pool:
      max_open: 4
      max_idle: 2
      max_lifetime: "1h"
    lifecycle:
      auto_start: true
Eine private In-Memory-SQLite-Datenbank (file: ":memory:") ist auf eine physische Verbindung beschränkt, daher werden max_open und max_idle auf 1 gesetzt. Eine dateibasierte Datenbank berücksichtigt die konfigurierten pool-Einstellungen, was eine CDC-Snapshot-Lesetransaktion benötigt, damit sie nicht die einzige Schreibverbindung belegt. Der Journal-Modus ist immer WAL.

Verbindungsfelder

Standard-Datenbankfelder

Feld Typ Beschreibung
host string Datenbank-Host-Adresse
port int Datenbank-Portnummer
database string Datenbankname
username string Datenbankbenutzer
password string Datenbankpasswort
pool object Connection-Pool-Einstellungen
options map Datenbankspezifische Optionen
lifecycle object Lebenszyklus-Konfiguration

SQLite-Felder

Feld Typ Standard Beschreibung
file string erforderlich Datenbankdateipfad oder :memory:
pool object - Connection-Pool-Einstellungen; max_open und max_idle werden für :memory: auf 1 gesetzt
max_mutation_changes int 100000 Zeilen, die eine Transaktion im Beobachter für committete Mutationen halten darf
max_mutation_bytes int 67108864 Logische Bytes, die eine Transaktion im Beobachter halten darf (64 MiB)
options map - Akzeptiert, aber ignoriert
lifecycle object - Lebenszyklus-Konfiguration

max_mutation_changes und max_mutation_bytes begrenzen den In-Memory-Beobachter für committete Mutationen, der eine db.cdc.sqlite-Quelle speist. Null bei einem der Felder wählt den Standardwert; negative Werte werden abgelehnt. Die Grenzen sind konservativ statt exakt: SQLite liefert eine vollständige Zeile an den Pre-Update-Hook, sodass eine Zeile materialisiert werden kann, bevor die Grenze den Kandidaten ablehnt.

Geheimnis- und Umgebungswerte

Hole Verbindungswerte über ${env:NAME}-Platzhalter aus der Umgebungs-Registry; sie werden beim Dekodieren aufgelöst. NAME ist der öffentliche Name einer registrierten Variable oder deren Entry-ID (z. B. app.secrets:db_password); es ist keine rohe Betriebssystem-Umgebungsvariable.

- 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}
Ältere Konfigurationen verwenden eine benachbarte <field>_env-Direktive (host_env, port_env, database_env, username_env, password_env), die auf dieselbe Weise aufgelöst wird. Diese Form ist veraltet — migriere sie auf den oben gezeigten ${env:NAME}-Platzhalter. Vermeiden Sie das Hardcodieren von Passwörtern in der Konfiguration. Verwenden Sie env.variable-Einträge für Anmeldedaten. Siehe Umgebung für sicheres Geheimnis-Management.

Connection-Pool

Konfigurieren Sie das Connection-Pooling-Verhalten. Pool-Einstellungen werden auf den database/sql-Connection-Pool von Go abgebildet.

Feld Typ Standard Beschreibung
max_open int 0 Maximale offene Verbindungen (0 = unbegrenzt)
max_idle int 0 Maximale untätige Verbindungen (0 = keine untätigen Verbindungen werden gehalten)
max_lifetime duration 1h Maximale Verbindungslebensdauer
pool:
  max_open: 25      # Limit concurrent connections
  max_idle: 5       # Keep 5 connections ready
  max_lifetime: "30m"  # Recycle connections every 30 minutes
Setzen Sie max_idle kleiner oder gleich max_open. Verbindungen, die max_lifetime überschreiten, werden geschlossen und ersetzt, was bei der Wiederherstellung von veralteten Verbindungen hilft.

DSN-Formate

Jeder Datenbanktyp konstruiert einen DSN aus der Konfiguration. Etwaige options werden angehängt (nach Schlüssel sortiert); standardmäßig ist keine enthalten.

PostgreSQL {id="dsn-postgresql"}

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

Jeder Wert außer dem Port wird in einfache Anführungszeichen gesetzt, und eingebettete ' und \ werden mit Backslash escaped, sodass Hosts, Passwörter und Optionswerte mit Leerzeichen oder Anführungszeichen unverändert durchgereicht werden.

MySQL {id="dsn-mysql"}

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

SQLite {id="dsn-sqlite"}

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

Datenbankoptionen

Häufige datenbankspezifische Optionen:

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 wendet die options-Map nicht auf seinen DSN an. Dateidatenbanken öffnen immer mit mode=rwc, und der Journal-Modus ist immer auf WAL gesetzt. Das options-Feld wird akzeptiert, aber ignoriert.

Beispiele

PostgreSQL mit 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

MySQL Read Replica

- 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 In-Memory

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

Mehrere Datenbanken Setup

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

Laufzeitregistrierung

Datenbanken können zur Laufzeit mit dem Registry-Modul registriert werden.

Lua-API

Siehe SQL-Modul für Abfragen, Transaktionen und Verbindungsoperationen.

Siehe auch

  • SQL-Modul - Lua-API-Referenz
  • Store - Key-Value-Store auf Basis einer db.sql.*-Datenbank
  • Queue - SQL-gestützter Queue-Handler
  • Change Data Capture - Zeilenweise Änderungen aus einer db.sql.sqlite- oder Postgres-Datenbank streamen