你好!这个问题主要与 Dify 支持的数据库类型有关。
根据你的报错信息 pymysql.err.ProgrammingError 以及你提到的使用 seekdb (OceanBase/MySQL 兼容) 作为元数据库,问题的核心原因在于:
Dify 的核心元数据(Metadata)数据库目前仅官方支持 PostgreSQL,不支持 MySQL 或 OceanBase。
以下是详细分析:
1. 为什么报错 “Table doesn’t exist”?
Dify 使用 SQLAlchemy 和 Alembic 进行数据库迁移(自动创建表)。由于 Dify 的代码和迁移脚本是专门为 PostgreSQL 编写的(使用了许多 PG 特有的特性,如 UUID 类型、JSONB 字段索引等),当你强制将 DB_TYPE 配置为 mysql 或连接到 MySQL 协议的数据库时:
- 自动迁移脚本可能无法正确执行,导致表没有被创建。
- 或者应用启动时依赖的 PG 特性在 MySQL 上不可用,导致部分表缺失。
你截图中的 dify_plugin 数据库可能有部分表,但这可能是插件系统尝试创建的,而核心业务表(如 workflow_schedule_plans,用于定时工作流)未能创建。
2. 数据库兼容性说明
- 核心业务数据库 (Metadata DB): 必须是 PostgreSQL (版本通常要求 v14+)。这是存放应用配置、用户、工作流定义、日志等核心数据的地方。
- 向量数据库 (Vector DB): Dify 支持多种向量库,包括 Weaviate, Qdrant, Milvus, PgVector, OceanBase (作为向量库) 等。
重要区别:你可以使用 OceanBase/SeekDB 作为向量数据库,但不能用它来替代 PostgreSQL 作为核心业务数据库。
3. 解决方案
请恢复 docker-compose.yml 或环境变量中关于核心数据库的配置为 PostgreSQL。
正确的架构配置建议:
- 核心数据库 (
db): 使用 Docker 部署中默认的 Postgres 容器,或者外部托管的 PostgreSQL 数据库。 - 向量数据库 (
vector_store): 如果你想用 OceanBase/SeekDB,请仅将其配置为向量存储后端。
参考配置 (.env):
# 核心数据库 (必须是 PostgreSQL)
DB_TYPE=postgres
DB_HOST=<你的Postgres地址>
DB_PORT=5432
DB_DATABASE=dify
# 向量数据库 (可以使用 OceanBase)
VECTOR_STORE=oceanbase
OCEANBASE_VECTOR_HOST=<你的SeekDB/OceanBase地址>
OCEANBASE_VECTOR_PORT=2881
...
总结
目前的报错是因为 Dify 强依赖 PostgreSQL,无法在 MySQL/OceanBase 上正常初始化核心表结构。请将主数据库切换回 PostgreSQL 即可解决此问题。