やること:DDLを ConfigMap に入れて、Job で Postgres に流し込みます。
1) ファイルを作成(相対パスはこのフォルダ直下から)
k8s/dev/portal_fields-schema-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: devportal-schema
namespace: infra
data:
001_schema.sql: |
CREATE TABLE IF NOT EXISTS portal_fields (
id BIGSERIAL PRIMARY KEY,
model TEXT NOT NULL,
model_table TEXT NOT NULL,
field_name TEXT NOT NULL,
ttype TEXT NOT NULL,
relation_model TEXT,
label_i18n JSONB,
help_i18n JSONB,
placeholder_i18n JSONB,
unit_i18n JSONB,
translate BOOLEAN NOT NULL DEFAULT FALSE,
selection_items JSONB,
default_value JSONB,
widget TEXT,
ui_control JSONB,
groups_xml_ids TEXT[],
origin TEXT NOT NULL DEFAULT 'portal',
code_status TEXT NOT NULL DEFAULT 'planned',
notes TEXT,
created_at TIMESTAMP NOT NULL DEFAULT now(),
updated_at TIMESTAMP NOT NULL DEFAULT now(),
CONSTRAINT uq_portal_fields UNIQUE (model, field_name),
CONSTRAINT ck_ttype CHECK (ttype IN ('char','text','html','integer','float','boolean','selection','many2one','one2many','many2many','date','datetime','monetary','binary')),
CONSTRAINT ck_relation_required CHECK (
(ttype IN ('many2one','one2many','many2many') AND relation_model IS NOT NULL)
OR (ttype NOT IN ('many2one','one2many','many2many'))
)
);
CREATE INDEX IF NOT EXISTS idx_portal_fields_model ON portal_fields (model);
CREATE INDEX IF NOT EXISTS idx_portal_fields_status ON portal_fields (code_status);
CREATE INDEX IF NOT EXISTS idx_portal_fields_groups_gin ON portal_fields USING GIN (groups_xml_ids);
CREATE INDEX IF NOT EXISTS idx_portal_fields_label_gin ON portal_fields USING GIN (label_i18n);
CREATE INDEX IF NOT EXISTS idx_portal_fields_ui_gin ON portal_fields USING GIN (ui_control);
k8s/infra/postgres/devportal-db-init-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: devportal-db-init
namespace: infra
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: psql
image: postgres:16
env:
- name: PGPASSWORD
value: dev
command: ["bash","-lc"]
args:
- psql -h postgres.infra.svc.cluster.local -U dev -d devportal -f /schema/001_schema.sql
volumeMounts:
- name: schema
mountPath: /schema
volumes:
- name: schema
configMap:
name: devportal-schema
items:
- key: 001_schema.sql
path: 001_schema.sql
保存時は 改行コード LF を必ず選んでください(VSCode右下が「LF」)。
2) 適用(このフォルダから)
kubectl -n infra apply -f k8s/dev/portal_fields-schema-configmap.yaml
kubectl -n infra delete job devportal-db-init --ignore-not-found
kubectl -n infra apply -f k8s/infra/postgres/devportal-db-init-job.yaml
# 完了・ログ確認
kubectl -n infra wait --for=condition=complete job/devportal-db-init --timeout=90s
kubectl -n infra logs job/devportal-db-init
成功の目安:エラーなく完了(ログは無音でもOK)。
3) ほんとにテーブルできた?(確認ジョブ)
kubectl -n infra delete job pg-verify --ignore-not-found
kubectl -n infra apply -f - <<'YAML'
apiVersion: batch/v1
kind: Job
metadata:
name: pg-verify
namespace: infra
spec:
backoffLimit: 0
template:
spec:
restartPolicy: Never
containers:
- name: psql
image: postgres:16
env:
- name: PGPASSWORD
value: dev
command: ["bash","-lc"]
args:
- |
psql -h postgres.infra.svc.cluster.local -U dev -d devportal -t -c "\d+ portal_fields"
YAML
kubectl -n infra logs job/pg-verify
portal_fields のカラム一覧が出ればOK。
コメントを残す