# Database
_Path: en/system/database_
## Table of Contents
- Database System
## Content
# Database System
SQL database connection pooling and configuration. Supports PostgreSQL, MySQL, SQLite, Microsoft SQL Server, and Oracle.
## Entry Kinds
| Kind | Description |
|------|-------------|
| `db.sql.postgres` | PostgreSQL database |
| `db.sql.mysql` | MySQL database |
| `db.sql.sqlite` | SQLite database |
| `db.sql.mssql` | Microsoft SQL Server |
| `db.sql.oracle` | Oracle database |
### Standard Databases (PostgreSQL, MySQL, MSSQL, Oracle)
```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_open: 1
max_idle: 1
max_lifetime: "1h"
options:
cache: "shared"
lifecycle:
auto_start: true
```
### 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 | Connection pool settings |
| `options` | map | SQLite-specific options |
| `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 = unlimited) |
| `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:
### PostgreSQL {id="dsn-postgresql"}
```
postgres://username:password@host:port/database?sslmode=disable
```
### MySQL {id="dsn-mysql"}
```
username:password@tcp(host:port)/database?charset=utf8mb4
```
### SQLite {id="dsn-sqlite"}
```
file:/path/to/database.db?cache=shared
:memory:?mode=memory
```
### Microsoft SQL Server {id="dsn-mssql"}
```
sqlserver://username:password@host:port?database=dbname
```
### Oracle {id="dsn-oracle"}
```
oracle://username:password@host:port/service_name
```
## 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"}
```yaml
options:
cache: "shared" # shared, private
mode: "rwc" # ro, rw, rwc, memory
_journal_mode: "WAL" # DELETE, TRUNCATE, PERSIST, MEMORY, WAL, OFF
```
### Microsoft SQL Server {id="options-mssql"}
```yaml
options:
encrypt: "true"
TrustServerCertificate: "false"
```
### Oracle {id="options-oracle"}
```yaml
options:
poolMinSessions: "1"
poolMaxSessions: "10"
poolIncrement: "1"
```
### 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:"
pool:
max_open: 1
max_idle: 1
options:
cache: "shared"
mode: "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.
## Navigation
Previous: Terminal (system/terminal)
Next: Store (system/store)