Milestone 2 — portal_fields の DDL を適用

やること: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。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です