数据库详情查询

This commit is contained in:
mark
2026-09-27 17:09:48 +08:00
parent 7c6fcb4a37
commit 364e6eb1a4
53 changed files with 329 additions and 8 deletions
Binary file not shown.
@@ -1,3 +0,0 @@
2026/09/27-14:57:08.137 a0f8 Reusing MANIFEST D:\dndClaw\agent-console\.electron-userdata\Local Storage\leveldb/MANIFEST-000001
2026/09/27-14:57:08.169 a0f8 Recovering log #3
2026/09/27-14:57:08.171 a0f8 Reusing old log D:\dndClaw\agent-console\.electron-userdata\Local Storage\leveldb/000003.log
@@ -1,3 +0,0 @@
2026/09/27-14:57:08.545 a0f8 Reusing MANIFEST D:\dndClaw\agent-console\.electron-userdata\Session Storage/MANIFEST-000001
2026/09/27-14:57:08.546 a0f8 Recovering log #3
2026/09/27-14:57:08.546 a0f8 Reusing old log D:\dndClaw\agent-console\.electron-userdata\Session Storage/000003.log
+50
View File
@@ -34,6 +34,56 @@ export function initDatabase(dbDir: string): Database.Database {
CREATE INDEX IF NOT EXISTS idx_llm_active ON llm_configs(is_active);
-- ========== 从后端同步的表(字段与后端 PostgreSQL 对齐) ==========
-- 租户信息
CREATE TABLE IF NOT EXISTS tenants (
id INTEGER PRIMARY KEY, -- 后端 BIGSERIAL
name TEXT NOT NULL,
code TEXT UNIQUE,
status TEXT, -- active / disabled
plan TEXT, -- free / pro
created_at TEXT,
updated_at TEXT,
synced_at TEXT -- 本地同步时间(PC端记录)
);
-- 门店信息
CREATE TABLE IF NOT EXISTS stores (
id INTEGER PRIMARY KEY,
tenant_id INTEGER NOT NULL,
name TEXT NOT NULL,
code TEXT NOT NULL,
city TEXT,
address TEXT,
is_flagship INTEGER DEFAULT 0, -- 0/1
status TEXT, -- active / preparing / disabled
created_at TEXT,
updated_at TEXT,
synced_at TEXT
);
CREATE INDEX IF NOT EXISTS idx_stores_tenant ON stores(tenant_id);
-- 用户信息(不同步 password_hash / failed_attempts / locked_until / deleted_at)
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
tenant_id INTEGER NOT NULL,
username TEXT NOT NULL,
phone TEXT,
email TEXT,
display_name TEXT,
role TEXT, -- owner / admin / manager / staff
status TEXT, -- active / disabled
current_store_id INTEGER,
last_login_at TEXT,
created_at TEXT,
updated_at TEXT,
synced_at TEXT
);
CREATE INDEX IF NOT EXISTS idx_users_tenant ON users(tenant_id);
-- 同步队列(outbox):本地变更等待推送到云端
CREATE TABLE IF NOT EXISTS sync_outbox (
id TEXT PRIMARY KEY,
+277
View File
@@ -0,0 +1,277 @@
# SQLite 数据库迁移日志
> 文件位置:`agent-core/src/db/migrations.md`
> 数据库文件:`<userData>/data/agent-console.db`
> 每次修改数据库表结构后,必须在本文件追加新的迁移版本记录。
---
## 版本历史
| 版本 | 日期 | 说明 |
|------|------|------|
| [v1.0.0](#v100---2026-09-27) | 2026-09-27 | 初始建库,建立 6 张表 |
---
## v1.0.0 — 2026-09-27
**变更类型**:初始建库(CREATE TABLE)
**变更说明**:首次创建 agent-core 的 SQLite 数据库,包含 LLM 配置、同步队列、同步元数据,以及从后端同步的租户/门店/用户表。
**新增表(6 张)**:
### 1. `llm_configs` — LLM API 配置表
**字段清单**:
| 字段(column) | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | TEXT | PRIMARY KEY | 配置唯一 ID(UUID v4) |
| name | TEXT | NOT NULL | 配置显示名称 |
| provider | TEXT | NOT NULL | Provider 标识(qianfan_v2 / openai) |
| config | TEXT | NOT NULL | 配置 JSON 字符串(baseUrl/authorization/apiKey/model/temperature) |
| is_active | INTEGER | DEFAULT 0 | 是否为当前激活配置(1=是,0=否) |
| created_at | TEXT | DEFAULT datetime('now') | 创建时间(UTC) |
| updated_at | TEXT | DEFAULT datetime('now') | 最后更新时间(UTC) |
**索引**:`idx_llm_active(is_active)`
**建表 SQL**:
```sql
CREATE TABLE IF NOT EXISTS llm_configs (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
provider TEXT NOT NULL,
config TEXT NOT NULL,
is_active INTEGER DEFAULT 0,
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_llm_active ON llm_configs(is_active);
```
---
### 2. `sync_outbox` — 同步队列(outbox)
**字段清单**:
| 字段(column) | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | INTEGER | PRIMARY KEY AUTOINCREMENT | 自增 ID |
| table_name | TEXT | NOT NULL | 变更的表名 |
| record_id | TEXT | NOT NULL | 变更记录 ID |
| operation | TEXT | NOT NULL | INSERT / UPDATE / DELETE |
| payload | TEXT | NOT NULL | 变更数据 JSON |
| status | TEXT | NOT NULL DEFAULT 'pending' | pending / syncing / done / failed |
| retry_count | INTEGER | DEFAULT 0 | 重试次数 |
| last_error | TEXT | | 最后错误信息 |
| created_at | TEXT | DEFAULT datetime('now') | 创建时间 |
| updated_at | TEXT | DEFAULT datetime('now') | 更新时间 |
**索引**:
- `idx_outbox_status(status)` — 加速查询待同步记录
- `idx_outbox_table(table_name)` — 按表名查询
**建表 SQL**:
```sql
CREATE TABLE IF NOT EXISTS sync_outbox (
id INTEGER PRIMARY KEY AUTOINCREMENT,
table_name TEXT NOT NULL,
record_id TEXT NOT NULL,
operation TEXT NOT NULL,
payload TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'pending',
retry_count INTEGER DEFAULT 0,
last_error TEXT,
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_outbox_status ON sync_outbox(status);
CREATE INDEX IF NOT EXISTS idx_outbox_table ON sync_outbox(table_name);
```
---
### 3. `sync_meta` — 同步元数据
**字段清单**:
| 字段(column) | 类型 | 约束 | 说明 |
|------|------|------|------|
| table_name | TEXT | PRIMARY KEY | 表名(tenants / stores / users ...) |
| last_synced_at | TEXT | NOT NULL | 最后同步时间(ISO 8601) |
| last_sync_count | INTEGER | | 本次同步条数 |
| sync_status | TEXT | | success / failed |
| error_msg | TEXT | | 失败原因 |
**建表 SQL**:
```sql
CREATE TABLE IF NOT EXISTS sync_meta (
table_name TEXT PRIMARY KEY,
last_synced_at TEXT NOT NULL,
last_sync_count INTEGER,
sync_status TEXT,
error_msg TEXT
);
```
---
### 4. `tenants` — 租户信息(从后端同步)
**字段清单**:
| 字段(column) | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | INTEGER | PRIMARY KEY | 租户 ID(后端 BIGSERIAL) |
| name | TEXT | NOT NULL | 租户名称 |
| code | TEXT | UNIQUE | 租户编码 |
| status | TEXT | | active / disabled |
| plan | TEXT | | free / pro |
| created_at | TEXT | | 创建时间 |
| updated_at | TEXT | | 更新时间 |
| synced_at | TEXT | | 本地同步时间(PC 端记录) |
**建表 SQL**:
```sql
CREATE TABLE IF NOT EXISTS tenants (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
code TEXT UNIQUE,
status TEXT,
plan TEXT,
created_at TEXT,
updated_at TEXT,
synced_at TEXT
);
```
---
### 5. `stores` — 门店信息(从后端同步)
**字段清单**:
| 字段(column) | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | INTEGER | PRIMARY KEY | 门店 ID |
| tenant_id | INTEGER | NOT NULL | 所属租户 |
| name | TEXT | NOT NULL | 门店名称 |
| code | TEXT | NOT NULL | 门店编码 |
| city | TEXT | | 所在城市 |
| address | TEXT | | 门店地址 |
| is_flagship | INTEGER | DEFAULT 0 | 是否旗舰店(0/1) |
| status | TEXT | | active / preparing / disabled |
| created_at | TEXT | | 创建时间 |
| updated_at | TEXT | | 更新时间 |
| synced_at | TEXT | | 本地同步时间 |
**索引**:`idx_stores_tenant(tenant_id)`
**建表 SQL**:
```sql
CREATE TABLE IF NOT EXISTS stores (
id INTEGER PRIMARY KEY,
tenant_id INTEGER NOT NULL,
name TEXT NOT NULL,
code TEXT NOT NULL,
city TEXT,
address TEXT,
is_flagship INTEGER DEFAULT 0,
status TEXT,
created_at TEXT,
updated_at TEXT,
synced_at TEXT
);
CREATE INDEX IF NOT EXISTS idx_stores_tenant ON stores(tenant_id);
```
---
### 6. `users` — 用户信息(从后端同步,不含安全字段)
**字段清单**:
| 字段(column) | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | INTEGER | PRIMARY KEY | 用户 ID |
| tenant_id | INTEGER | NOT NULL | 所属租户 |
| username | TEXT | NOT NULL | 用户名 |
| phone | TEXT | | 手机号 |
| email | TEXT | | 邮箱 |
| display_name | TEXT | | 显示名 |
| role | TEXT | | owner / admin / manager / staff |
| status | TEXT | | active / disabled |
| current_store_id | INTEGER | | 当前门店 |
| last_login_at | TEXT | | 最后登录时间 |
| created_at | TEXT | | 创建时间 |
| updated_at | TEXT | | 更新时间 |
| synced_at | TEXT | | 本地同步时间 |
**索引**:`idx_users_tenant(tenant_id)`
**建表 SQL**:
```sql
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
tenant_id INTEGER NOT NULL,
username TEXT NOT NULL,
phone TEXT,
email TEXT,
display_name TEXT,
role TEXT,
status TEXT,
current_store_id INTEGER,
last_login_at TEXT,
created_at TEXT,
updated_at TEXT,
synced_at TEXT
);
CREATE INDEX IF NOT EXISTS idx_users_tenant ON users(tenant_id);
```
> **不同步字段**:后端 `users` 表的 `password_hash`、`failed_attempts`、`locked_until`、`deleted_at` 字段出于安全考虑不同步到本地。
---
## 数据库参数
- **WAL 模式**:已启用(`journal_mode = WAL`)
- **外键约束**:已启用(`foreign_keys = ON`)
- **同步架构**:本地 SQLite 为权威源,异步推送到云端;云端变更拉取合并到本地
---
## 迁移规范
后续每次修改数据库,按以下格式追加新版本:
```markdown
## vX.Y.Z — YYYY-MM-DD
**变更类型**:CREATE TABLE / ALTER TABLE / DROP TABLE / INDEX
**变更说明**:简要说明变更目的
**变更内容**:
- 表名:字段变更详情(含字段清单表格 + SQL 语句)
```
**类型映射规则**(PostgreSQL → SQLite):
| PostgreSQL | SQLite |
|---|---|
| BIGSERIAL | INTEGER PRIMARY KEY |
| BIGINT / INTEGER | INTEGER |
| VARCHAR / TEXT | TEXT |
| BOOLEAN | INTEGER (0/1) |
| NUMERIC / DECIMAL | REAL |
| TIMESTAMPTZ | TEXT (ISO 8601) |
| JSONB | TEXT (JSON 字符串) |