Skip to content

[Feature] 把 PostgreSQL 做成一等公民(独立迁移树 + JSONB + 集成测试) #426

Description

@ncw1992120

你在解决什么问题?

项目目前已有 postgres profile 和 PostgreSQL 驱动,但它其实是个寄生的半成品,想用 PostgreSQL 上生产的人会踩到下面这些坑:

  1. 没有独立迁移树application-postgres.ymlflyway.locations 指向 db/migration/kingbase。PostgreSQL 借用 KingbaseES 的迁移脚本,导致 PG 想做任何专属优化都被 KingbaseES 兼容性绑住。
  2. 从没被真实数据库验证过:仓库没有 CI,也没有任何针对 PostgreSQL 的测试。所谓"支持 PG"目前是纸面的——没人能保证那 150+ 个迁移在真实 PG 上跑得通。
  3. JSON 全存 TEXT:约 40 个 JSON 列(config_json / headers_json / settings_json / delivery_config …)在 PG 上仍是 TEXT,完全没用上 PG 的 JSONB(写入校验、未来可索引)。
  4. 没有 PG 部署文档:README / 文档只讲 MySQL。

相关:#244 提到希望支持更多数据库类型——这个 issue 不是加新厂商,而是先把已经存在的 PostgreSQL 支持补成真正可用、可验证、有文档的一等公民。

你期望它怎么工作?

按单一关注点拆成 5 个独立 PR:

  1. fork 独立迁移树 db/migration/postgresql(从 kingbase 树 fork,fork 时字节一致 → 切 location 对现有部署透明,Flyway 按 checksum 而非路径判定);顺手补齐 application-kingbase.yml 缺失的 mate.wiki.watcher-*
  2. 高频 JSON 列 TEXT → JSONB(约 40 列;params_schema / output_schema / mate_message.metadata 这类任意文本/半结构化的刻意保持 TEXT)。JDBC URL 加 stringtype=unspecified 让 String 绑定的 JSON 值能写入 JSONB;把唯一对 JSON 列做字符串操作的 V53 改写成 JSONB 原生 || 合并。
  3. Testcontainers 集成测试:真实 postgres:16 跑完整迁移树 + JSONB CRUD 往返 + 非法 JSON 拒绝;@Testcontainers(disabledWithoutDocker=true),无 Docker 自动跳过不影响日常构建。
  4. docker-compose.pg.yml 叠加文件:一条命令把后端切到 PostgreSQL。
  5. 文档:新增中英 database-postgresql.md,更新 README / CLAUDE.md / config / docker-deploy。

每个 PR 都已在真实 PostgreSQL 16 上验证(153 迁移全绿、列物理类型 = jsonb、JacksonTypeHandler 往返、非法 JSON 被拒)。

实现已完成,PR 随后提交,关联本 issue。

你试过的替代方案?

  • 继续共用 kingbase 树:能跑,但 PG 和 KingbaseES 的演进被绑死,且依然没有验证和文档。独立树让两者解耦,且 fork 时零行为差异。
  • JSONB 用自定义 TypeHandler:可行但要改 ~40 处实体 + 大量回归。stringtype=unspecified 一行覆盖所有写入路径(含 JacksonTypeHandler),零 Java 改动,是 PG JDBC 官方推荐姿势。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions