# Database _Path: en/system/database_ ## Table of Contents - Database System ## Content # Database System SQL database connection pooling and configuration. Supports PostgreSQL, MySQL, and SQLite. ## Entry Kinds | Kind | Description | |------|-------------| | `db.sql.postgres` | PostgreSQL database | | `db.sql.mysql` | MySQL database | | `db.sql.sqlite` | SQLite database | ### Standard Databases (PostgreSQL, MySQL) ```yaml # 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 ```yaml - name: cache_db kind: db.sql.sqlite file: "/var/data/cache.db" # Use :memory: for in-memory pool: max_lifetime: "1h" lifecycle: auto_start: true ``` SQLite always runs with a single connection (max_open and max_idle are forced to 1) and WAL journal mode. Only max_lifetime from pool is applied. ### Standard Database Fields | Field | Type | Description | |-------|------|-------------| | `host` | string | Database host address | | `port` | int | Database port number | | `database` | string | Database name | | `username` | string | Database user | | `password` | string | Database password | | `pool` | object | Connection pool settings | | `options` | map | Database-specific options | | `lifecycle` | object | Lifecycle configuration | ### SQLite Fields | Field | Type | Description | |-------|------|-------------| | `file` | string | Database file path or `:memory:` | | `pool` | object | Only `max_lifetime` is applied (connections are fixed at 1) | | `options` | map | Accepted but ignored | | `lifecycle` | object | Lifecycle configuration | ### Environment Variable Fields Use `_env` suffix to load values from environment variables or [env.variable](system/env.md) entries: | Field | Description | |-------|-------------| | `host_env` | Host from environment variable | | `port_env` | Port from environment variable | | `database_env` | Database name from environment | | `username_env` | Username from environment | | `password_env` | Password from environment | ```yaml - 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" # Reference env.variable entry ``` Avoid hardcoding passwords in configuration. Use environment variables or env.variable entries for credentials. See Environment for secure secret management. ## Connection Pool Configure connection pooling behavior. Pool settings map to Go's [database/sql connection pool](https://pkg.go.dev/database/sql#DB.SetMaxOpenConns). | Field | Type | Default | Description | |-------|------|---------|-------------| | `max_open` | int | 0 | Maximum open connections (0 = unlimited) | | `max_idle` | int | 0 | Maximum idle connections (0 = no idle connections retained) | | `max_lifetime` | duration | 1h | Maximum connection lifetime | ```yaml pool: max_open: 25 # Limit concurrent connections max_idle: 5 # Keep 5 connections ready max_lifetime: "30m" # Recycle connections every 30 minutes ``` Set max_idle less than or equal to max_open. Connections exceeding max_lifetime are closed and replaced, helping recover from stale connections. ## DSN Formats Each database type constructs a DSN from configuration. Any `options` are appended (sorted by key); none are included by default. ### PostgreSQL {id="dsn-postgresql"} ``` host=host port=port user=username password=password dbname=database [option=value ...] ``` ### MySQL {id="dsn-mysql"} ``` username:password@tcp(host:port)/database[?option=value&...] ``` ### SQLite {id="dsn-sqlite"} ``` file:/path/to/database.db?mode=rwc :memory: ``` ## Database Options Common database-specific options: ### PostgreSQL {id="options-postgresql"} ```yaml options: sslmode: "require" # disable, require, verify-ca, verify-full connect_timeout: "10" # Connection timeout in seconds application_name: "myapp" ``` ### MySQL {id="options-mysql"} ```yaml options: charset: "utf8mb4" parseTime: "true" # Parse time values to time.Time loc: "Local" # Timezone ``` ### SQLite {id="options-sqlite"} SQLite does not apply the `options` map to its DSN. File databases always open with `mode=rwc`, and journal mode is always set to `WAL`. The `options` field is accepted but ignored. ### PostgreSQL with SSL ```yaml - 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 Read Replica ```yaml - 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 In-Memory ```yaml - name: test_db kind: db.sql.sqlite file: ":memory:" ``` ### Multiple Database Setup ```yaml 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: "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: "ANALYTICS_DB_PASSWORD" lifecycle: auto_start: true # Local cache - name: cache kind: db.sql.sqlite file: "/var/cache/app.db" lifecycle: auto_start: true ``` ## Runtime Registration Databases can be registered at runtime using the [registry module](lua/core/registry.md), enabling dynamic database configuration based on application state or external configuration. ## Lua API See [SQL Module](lua/storage/sql.md) for database operations API. ## See Also - [SQL Module](lua/storage/sql.md) - Lua API reference - [Store](system/store.md) - Key-value store backed by a `db.sql.*` database - [Queue](system/queue.md) - SQL-backed queue handler ## Navigation Previous: Terminal (system/terminal) Next: Store (system/store)