问题描述
在将 MaxKB 的 PostgreSQL 迁移到 Supabase(或任何共享 PostgreSQL 实例)时,发现代码中大量硬编码了 public schema 前缀,导致无法通过配置将表迁移到自定义 schema。
错误信息
django.db.utils.ProgrammingError: relation "public.document" does not exist
LINE 2: UPDATE "public"."document"
根因分析
-
SQL 文件中硬编码 schema:apps/system_manage/sql/ 下的 SQL 文件直接使用 public."user"、public."workspace" 等完全限定表名。
-
Django conf.py 不暴露 schema 配置:apps/maxkb/conf.py 的 get_db_setting() 方法不提供 OPTIONS 或 search_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)
- 数据库多租户部署
建议方案
- 移除 SQL 文件中的硬编码
public. 前缀,依赖 search_path 自动解析
- 在
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,
# ...
}
- 增加
MAXKB_DB_SCHEMA 环境变量支持
环境信息
- MaxKB 版本:v2.10.2-lts
- PostgreSQL:通过 Supavisor 连接池连接 Supabase
- 部署方式:Docker Compose
问题描述
在将 MaxKB 的 PostgreSQL 迁移到 Supabase(或任何共享 PostgreSQL 实例)时,发现代码中大量硬编码了
publicschema 前缀,导致无法通过配置将表迁移到自定义 schema。错误信息
根因分析
SQL 文件中硬编码 schema:
apps/system_manage/sql/下的 SQL 文件直接使用public."user"、public."workspace"等完全限定表名。Django conf.py 不暴露 schema 配置:
apps/maxkb/conf.py的get_db_setting()方法不提供OPTIONS或search_path配置项,无法通过环境变量覆盖默认 schema。相关代码位置:
apps/maxkb/conf.py-get_db_setting()方法apps/system_manage/sql/list_mapping_resource_ee.sql-LEFT JOIN "public"."user" uapps/system_manage/sql/get_resource_user_permission_detail_ee.sql-FROM public."user" u场景
在以下场景中会需要自定义 schema:
options=-c search_path=xxx)建议方案
public.前缀,依赖search_path自动解析get_db_setting()中支持OPTIONS配置,允许通过环境变量设置search_path:MAXKB_DB_SCHEMA环境变量支持环境信息