コンテンツにスキップ

データベースシステム

SQL データベース接続プーリングと設定。PostgreSQL、MySQL、SQLiteをサポート。

種別説明
db.sql.postgresPostgreSQLデータベース
db.sql.mysqlMySQLデータベース
db.sql.sqliteSQLiteデータベース

標準データベース(PostgreSQL、MySQL)

Section titled “標準データベース(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: "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" # インメモリには:memory:を使用
pool:
max_open: 1
max_idle: 1
max_lifetime: "1h"
options:
cache: "shared"
lifecycle:
auto_start: true
フィールド説明
hoststringデータベースホストアドレス
portintデータベースポート番号
databasestringデータベース名
usernamestringデータベースユーザー
passwordstringデータベースパスワード
poolobject接続プール設定
optionsmapデータベース固有のオプション
lifecycleobjectライフサイクル設定
フィールド説明
filestringデータベースファイルパスまたは:memory:
poolobject接続プール設定
optionsmapSQLite固有のオプション
lifecycleobjectライフサイクル設定

環境変数またはenv.variableエントリから値をロードするには_envサフィックスを使用:

フィールド説明
host_env環境変数からのホスト
port_env環境変数からのポート
database_env環境変数からのデータベース名
username_env環境変数からのユーザー名
password_env環境変数からのパスワード
- 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" # env.variableエントリを参照
設定にパスワードをハードコードしないでください。認証情報には環境変数またはenv.variableエントリを使用してください。セキュアなシークレット管理については環境変数を参照してください。

接続プーリング動作を設定。プール設定はGoのdatabase/sql接続プールにマップされます。

フィールドデフォルト説明
max_openint0最大オープン接続数(0 = 無制限)
max_idleint0最大アイドル接続数(0 = 無制限)
max_lifetimeduration1h最大接続寿命
pool:
max_open: 25 # 同時接続を制限
max_idle: 5 # 5接続を準備状態に維持
max_lifetime: "30m" # 30分ごとに接続をリサイクル
max_idlemax_open以下に設定してください。max_lifetimeを超えた接続は閉じられて置き換えられ、古い接続からの回復に役立ちます。

各データベースタイプは設定からDSNを構築します:

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

一般的なデータベース固有のオプション:

options:
sslmode: "require" # disable, require, verify-ca, verify-full
connect_timeout: "10" # 接続タイムアウト(秒)
application_name: "myapp"
options:
charset: "utf8mb4"
parseTime: "true" # 時間値をtime.Timeにパース
loc: "Local" # タイムゾーン
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"

複数データベースセットアップ

Section titled “複数データベースセットアップ”
entries:
# プライマリデータベース
- 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
# 分析データベース
- 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
# ローカルキャッシュ
- name: cache
kind: db.sql.sqlite
file: "/var/cache/app.db"
lifecycle:
auto_start: true

データベースはレジストリモジュールを使用してランタイムで登録でき、アプリケーション状態や外部設定に基づいた動的なデータベース設定が可能です。

データベース操作APIについてはSQLモジュールを参照してください。