Skip to content

[Feature] 建议支持自定义 PostgreSQL schema(当前硬编码 public) #6508

Description

@SAXEM1997

问题描述

在将 MaxKB 的 PostgreSQL 迁移到 Supabase(或任何共享 PostgreSQL 实例)时,发现代码中大量硬编码了 public schema 前缀,导致无法通过配置将表迁移到自定义 schema。

错误信息

django.db.utils.ProgrammingError: relation "public.document" does not exist
LINE 2: UPDATE "public"."document"

根因分析

  1. SQL 文件中硬编码 schemaapps/system_manage/sql/ 下的 SQL 文件直接使用 public."user"public."workspace" 等完全限定表名。

  2. Django conf.py 不暴露 schema 配置apps/maxkb/conf.pyget_db_setting() 方法不提供 OPTIONSsearch_path 配置项,无法通过环境变量覆盖默认 schema。

相关代码位置:

  • apps/maxkb/conf.py - get_db_setting() 方法
  • apps/system_manage/sql/list_mapping_resource_ee.sql - LEFT JOIN "public"."user" u
  • apps/system_manage/sql/get_resource_user_permission_detail_ee.sql - FROM public."user" u

场景

在以下场景中会需要自定义 schema:

  • 多应用共享一个 PostgreSQL 实例(如 Supabase 单数据库模式)
  • 使用 PgBouncer/Supavisor 连接池(不支持 options=-c search_path=xxx
  • 数据库多租户部署

建议方案

  1. 移除 SQL 文件中的硬编码 public. 前缀,依赖 search_path 自动解析
  2. get_db_setting() 中支持 OPTIONS 配置,允许通过环境变量设置 search_path
    def get_db_setting(self) -> dict:
        db_schema = self.get("DB_SCHEMA", "public")
        options = {}
        if db_schema != "public":
            options["options"] = f"-c search_path={db_schema}"
        return {
            "NAME": self.get("DB_NAME"),
            # ...
            "OPTIONS": options,
            # ...
        }
  3. 增加 MAXKB_DB_SCHEMA 环境变量支持

环境信息

  • MaxKB 版本:v2.10.2-lts
  • PostgreSQL:通过 Supavisor 连接池连接 Supabase
  • 部署方式:Docker Compose

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions