数据库 Schema
社区贡献
本教程为社区贡献,不属于 Open WebUI 团队的官方支持范围。它仅用于演示如何针对 您的特定用例自定义 Open WebUI。想要贡献?请参阅贡献指南教程。
[!WARNING] 本篇文档反映了截至 Open WebUI v0.9.5 版本的数据库表结构 (Schema) 变更。
Open WebUI 内部 SQLite 数据库
对于 Open WebUI 来说,SQLite 数据库是用户管理、对话历史记录、文件存储以及各种其他核心功能的基石。理解这一结构对于任何希望有效地为该项目做贡献或进行维护的人来说都至关重要。
内部 SQLite 位置
您可以在以下路径找到 SQLite 数据库:根目录 -> data -> webui.db
📁 Root (/)
├── 📁 data
│ ├── 📁 cache
│ ├── 📁 uploads
│ ├── 📁 vector_db
│ └── 📄 webui.db
├── 📄 dev.sh
├── 📁 open_webui
├── 📄 requirements.txt
├── 📄 start.sh
└── 📄 start_windows.bat本地复制数据库
如果您想将容器中运行的 Open WebUI SQLite 数据库复制到本地机器,可以使用:
docker cp open-webui:/app/backend/data/webui.db ./webui.db或者,您也可以使用以下命令直接进入容器内部访问数据库:
docker exec -it open-webui /bin/sh表结构概述
以下是 Open WebUI 的 SQLite 数据库中所有表的完整列表。为了方便起见,各表按字母顺序排列并进行了编号。
| 编号 | 表名 | 描述 |
|---|---|---|
| 01 | access_grant | 存储所有资源的标准化访问控制授权配置 |
| 02 | auth | 存储用户身份验证凭据和登录信息 |
| 03 | calendar | 存储包含访问控制的、用户拥有的日历 |
| 04 | calendar_event | 存储支持循环规则 (RRULE) 的日历事件 |
| 05 | calendar_event_attendee | 跟踪共享日历事件的参与者 RSVP 回复 |
| 06 | channel | 管理聊天频道及其配置 |
| 07 | channel_file | 将文件链接至频道和消息 |
| 08 | channel_member | 跟踪频道内的用户成员资格和权限 |
| 09 | chat | 存储对话会话及其元数据 |
| 10 | chat_file | 将文件链接至对话和消息 |
| 11 | chatidtag | 映射对话与其关联标签之间的关系 |
| 12 | config | 维护系统级别的全局配置设置 |
| 13 | document | 存储知识库管理所需的文档及其元数据 |
| 14 | feedback | 捕获用户反馈和评分 |
| 15 | file | 管理已上传的文件及其元数据 |
| 16 | folder | 将文件和内容组织进层级目录结构中 |
| 17 | function | 存储自定义的 Functions 及其配置 |
| 18 | group | 管理用户群组及其权限 |
| 19 | group_member | 跟踪群组内的用户成员资格 |
| 20 | knowledge | 存储知识库条目和相关信息 |
| 21 | knowledge_file | 将文件链接到知识库 |
| 22 | memory | 维护对话历史和上下文记忆 (Memory) |
| 23 | message | 存储单条聊天消息及其内容 |
| 24 | message_reaction | 记录用户对消息的反应(表情符号/回应) |
| 25 | migrate_history | 跟踪数据库 Schema 版本和迁移记录 |
| 26 | model | 管理 AI 模型配置和设置 |
| 27 | note | 存储用户创建的笔记和注释 |
| 28 | oauth_session | 管理活跃的用户 OAuth 会话 |
| 29 | prompt | 存储 AI 提示词 (Prompts) 的模板和配置 |
| 30 | prompt_history | 跟踪提示词的版本历史和快照 |
| 31 | shared_chat | 存储共享对话的快照,用于生成共享链接 |
| 32 | skill | 存储可复用的 Markdown 指令集 (Skills) |
| 33 | tag | 管理用于内容分类的标签/类别 |
| 34 | tool | 存储系统工具和集成的配置 |
| 35 | user | 维护用户个人资料和账户信息 |
| 36 | automation | 存储用户定义的时间表自动化任务 |
| 37 | automation_run | 存储自动化任务的执行历史记录 |
| 38 | pinned_note | 跟踪每位用户的笔记置顶(每行 = 某个用户置顶了某篇笔记) |
注意:Open WebUI 的 SQLite 数据库中还有另外两个与 Open WebUI 核心功能无关的表已被排除:
- Alembic Version 表
- Migrate History 表
既然我们了解了所有的表,接下来就让我们逐个理解每个表的具体结构。
Access Grant(访问授权)表
| 列名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|
| id | Integer | PRIMARY KEY, AUTOINCREMENT | 唯一标识符 |
| resource_type | Text | NOT NULL | 资源类型(例如 model、knowledge、tool) |
| resource_id | Text | NOT NULL | 特定资源的 ID |
| principal_type | Text | NOT NULL | 被授权主体的类型:user 或 group |
| principal_id | Text | NOT NULL | 用户或群组的 ID(对于公共权限为 *) |
| permission | Text | NOT NULL | 权限级别:read 或 write |
| created_at | BigInteger | nullable | 授权创建的时间戳 |
关于 access_grant 表需要了解的事项:
- 在 (
resource_type,resource_id,principal_type,principal_id,permission) 上存在唯一性约束,以防止重复授权 - 在 (
resource_type,resource_id) 和 (principal_type,principal_id) 上建有索引,以实现高效查询 - 取代了以前嵌入在各个资源表中的
access_controlJSON 列 principal_type为user且principal_id为*代表公共(公开)访问权限- 同时支持群组级和单个用户级的访问授权
Auth(身份验证)表
| 列 名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|
| id | String | PRIMARY KEY | 唯一标识符 |
| String | - | 用户邮箱 | |
| password | Text | - | 哈希后的密码 |
| active | Boolean | - | 账户状态 |
关于 auth 表需要了解的事项:
- 使用 UUID 作为主键
- 与
users表呈一对一关系(共享相同 id)
Channel(频道)表
| 列名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|
| id | Text | PRIMARY KEY | 唯一标识符 (UUID) |
| user_id | Text | - | 频道的拥有者/创建者 |
| type | Text | nullable | 频道类型 |
| name | Text | - | 频道名称 |
| description | Text | nullable | 频道描述 |
| data | JSON | nullable | 弹性数据存储 |
| meta | JSON | nullable | 频道元数据 |
| created_at | BigInteger | - | 创建时间戳(纳秒) |
| updated_at | BigInteger | - | 最后更新时间戳(纳秒) |
关于 auth 表需要了解的事项:
- 使用 UUID 作为主键
- 频道名称不区分大小写(在数据库中存为小写)
Channel Member(频道成员)表
| 列名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|
| id | TEXT | NOT NULL | 频道成员关系的唯一标识符 |
| channel_id | TEXT | NOT NULL | 对频道的引用 |
| user_id | TEXT | NOT NULL | 对用户的引用 |
| created_at | BIGINT | - | 成员关系创建的时间戳 |
Channel File(频道文件)表
| 列名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|
| id | Text | PRIMARY KEY | 唯一标识符 (UUID) |
| user_id | Text | NOT NULL | 关联的拥有者 |
| channel_id | Text | FOREIGN KEY(channel.id), NOT NULL | 对频道的引用 |
| file_id | Text | FOREIGN KEY(file.id), NOT NULL | 对文件的引用 |
| message_id | Text | FOREIGN KEY(message.id), nullable | 对相关消息的引用 |
| created_at | BigInteger | NOT NULL | 创建时间戳 |
| updated_at | BigInteger | NOT NULL | 最后更新时间戳 |
关于 channel_file 表需要了解的事项:
- 在 (
channel_id,file_id) 上存在唯一性约束,以防止重复条目 - 支持级联删除 (CASCADE delete) 的外键关系
- 在
channel_id、file_id和user_id上建有索引,以优化性能
Chat(对话)表
| 列名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|
| id | String | PRIMARY KEY | 唯一标识符 (UUID) |
| user_id | String | - | 对话的拥有者 |
| title | Text | - | 对话标题 |
| chat | JSON | - | 对话内容和历史记录 |
| created_at | BigInteger | - | 创建时间戳 |
| updated_at | BigInteger | - | 最后更新时间戳 |
| share_id | Text | UNIQUE, nullable | 共享标识符 |
| archived | Boolean | default=False | 归档状态 |
| pinned | Boolean | default=False, nullable | 置顶状态 |
| meta | JSON | server_default="" | 包含标签的元数据 |
| folder_id | Text | nullable | 父文件夹 ID |
| tasks | JSON | nullable | 智能体工作流使用的对话级任务/待办事项列表 |
| summary | Text | nullable | 可选的对话摘要文本 |
| last_read_at | BigInteger | nullable | 上次阅读的时间戳,用于未读指示器 |
关于 chat 表需要了解 的事项:
tasks和summary支持对话会话中的结构化规划/状态界面展示。last_read_at被侧边栏未读状态逻辑使用(与updated_at进行对比)。- 当对话具有活动的共享链接时,
share_id会引用shared_chat.id的 Token。
Shared Chat(共享对话)表
| 列名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|
| id | Text | PRIMARY KEY | 在 /s/{id} URL 中使用的共享 Token (UUID) |
| chat_id | Text | FOREIGN KEY(chat.id) CASCADE, NOT NULL | 对原始对话的引用 |
| user_id | Text | NOT NULL | 创建该共享的用户 |
| title | Text | nullable | 共享时的对话标题 |
| chat | JSON | nullable | 共享时的对话内容快照 |
| created_at | BigInteger | nullable | 共享创建的时间戳 |
| updated_at | BigInteger | nullable | 上次更新快照的时间戳 |
关于 shared_chat 表需要了解的事项:
- 取代了先前通过在
chat表中插入user_id设置为shared-{chat_id}的虚拟行来存储共享对话快照的模式。 - 每一行都是共享时(或最后一次重新共享时)原始对话的不可变快照。当用户点击“更新并复制链接”时,该快照会被更新。
- 删除原始对话会级联删除对应的共享快照。
- 共享对话的访问控制是通过
access_grant表管理的,其中resource_type = 'shared_chat'。
Automation(自动化)表
| 列名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|
| id | Text | PRIMARY KEY | 唯一标识符 (UUID) |
| user_id | Text | NOT NULL | 自动化的拥有者 |
| name | Text | NOT NULL | 自动化显示的名称 |
| data | JSON | NOT NULL | 自动化负载(包括 prompt、model_id、rrule 以及可选的终端配置) |
| meta | JSON | nullable | 可选元数据 |
| is_active | Boolean | NOT NULL, default=True | 启用/暂停状态 |
| last_run_at | BigInteger | nullable | 上次执行时间 |
| next_run_at | BigInteger | nullable | 下次计划执行时间 |
| created_at | BigInteger | NOT NULL | 创建时间戳 |
| updated_at | BigInteger | NOT NULL | 最后更新时间戳 |
关于 automation 表需要了解的事项:
next_run_at建有索引以实现对到期执行任务的高效轮询。data.rrule定义了循环规则并驱动调度器的计算。
Automation Run(自动化 执行)表
| 列名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|
| id | Text | PRIMARY KEY | 唯一标识符 (UUID) |
| automation_id | Text | NOT NULL | 对自动化的引用 |
| chat_id | Text | nullable | 由此运行创建的对话(如果可用) |
| status | Text | NOT NULL | 运行状态(success / error) |
| error | Text | nullable | 状态为 error 时的错误详情 |
| created_at | BigInteger | NOT NULL | 执行记录时间戳 |
关于 automation_run 表需要了解的事项:
- 按
automation_id进行索引,以实现对单个自动化执行历史的快速查询。 - 当删除某个自动化任务时,其对应的执行记录也会被删除。
Calendar(日历)表
| 列名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|
| id | Text | PRIMARY KEY | 唯一标识符 (UUID) |
| user_id | Text | NOT NULL | 日历的拥有者 |
| name | Text | NOT NULL | 日历显示的名称 |
| color | Text | nullable | 显示的颜色(十六进制,例如 #3b82f6) |
| is_default | Boolean | NOT NULL, default=False | 这是否是用户的默认日历 |
| data | JSON | nullable | 可扩展的数据负载 |
| meta | JSON | nullable | 可选元数据 |
| created_at | BigInteger | NOT NULL | 创建时间戳 |
| updated_at | BigInteger | NOT NULL | 最后更新时间戳 |
关于 calendar 表需要了解的事项:
- 在
user_id上建有索引,以实现对每个用户日历列表的高效列出。 - 首次访问时会自动创建默认的“个人 (Personal)”日历。
- “计划任务 (Scheduled Tasks)”日历是虚拟的 —— 它不存储在此表中。相反,对于拥有 Automations 访问权限的用户,API 会在响应时合成该日历(其固定 ID 为
__scheduled_tasks__)。自动化的 RRULE 未来执行计划和过去的执行记录将作为虚拟事件渲染在此日历上。 - 访问控制通过
access_grant表(resource_type = 'calendar')进行管理,从而支持在用户和群组之间共享日历。 - 用户只能删除非默认的日历。删除日历会级联删除其所有的事件、参与者和访问授权。
Calendar Event(日历事件)表
| 列名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|
| id | Text | PRIMARY KEY |