数据库详情查询
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 字符串) |
|
||||
Reference in New Issue
Block a user