实现 SQLite 初始化与 v1 迁移 #7

Closed
opened 2026-08-06 16:08:29 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 阶段:2. SQLite 和本地任务列表

要解决什么

Client 还没有 SQLite 初始化代码。程序无法按数据模型基线创建本地数据库,也没有迁移版本、连接参数和可重复执行的初始化测试。

做什么 / 不做什么

  • 做:
    • 在 client/src/db.py 实现数据目录、数据库连接和初始化入口;
    • 在 client/src/db_schema.py 定义 v1 建表迁移;
    • 创建 pdd_tasks、task_runs、outbox_events、app_settings 四张表及索引;
    • 每个连接启用外键、WAL 和 5000 ms busy timeout;
    • 使用 PRAGMA user_version 管理迁移;
    • 在 client/test/test_db.py 使用临时数据库验证。
  • 不做:
    • 不接入 UI、Admin、uiautomator2 或真实任务流程;
    • 不实现 Repository 和 Python 任务数据模型;
    • 不创建或修改开发者真实的 client/data/client.db;
    • 不新增第三方依赖。

怎么做

  1. 使用 Python 3.10 内置 sqlite3 和 unittest。
  2. 保持扁平文件结构,避免为当前规模创建多层基础设施目录。
  3. db.py 提供直白函数:获取数据目录、取得默认数据库路径、打开连接、初始化数据库。
  4. db_schema.py 使用按版本排列的 SQL 语句元组;迁移逐版本在事务中执行,成功后更新 user_version。
  5. 数据表、字段、约束和索引严格采用 docs/client/03-data-model.md。
  6. 测试全部使用 TemporaryDirectory,保证重复运行且不污染真实数据。

预计修改:

  • client/src/db.py
  • client/src/db_schema.py
  • client/test/test_db.py

验收标准

  • 自定义路径首次初始化能创建父目录和数据库文件;
  • v1 初始化创建四张表和文档规定的索引;
  • PRAGMA user_version 初始化为 1;
  • 重复初始化不报错且不重复迁移;
  • 新连接启用外键、WAL 和 5000 ms busy timeout;
  • task type、status、金额、数量等 CHECK 约束生效;
  • task_runs 和 outbox_events 外键约束生效;
  • 高于程序支持版本的数据库会明确报错,不会降级或重建;
  • 测试只使用临时数据库;
  • 语法检查、unittest 和 git diff --check 通过。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m py_compile src/db.py src/db_schema.py test/test_db.py
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:2. SQLite 和本地任务列表 ## 要解决什么 Client 还没有 SQLite 初始化代码。程序无法按数据模型基线创建本地数据库,也没有迁移版本、连接参数和可重复执行的初始化测试。 ## 做什么 / 不做什么 - 做: - 在 `client/src/db.py` 实现数据目录、数据库连接和初始化入口; - 在 `client/src/db_schema.py` 定义 v1 建表迁移; - 创建 `pdd_tasks`、`task_runs`、`outbox_events`、`app_settings` 四张表及索引; - 每个连接启用外键、WAL 和 5000 ms busy timeout; - 使用 `PRAGMA user_version` 管理迁移; - 在 `client/test/test_db.py` 使用临时数据库验证。 - 不做: - 不接入 UI、Admin、uiautomator2 或真实任务流程; - 不实现 Repository 和 Python 任务数据模型; - 不创建或修改开发者真实的 `client/data/client.db`; - 不新增第三方依赖。 ## 怎么做 1. 使用 Python 3.10 内置 `sqlite3` 和 `unittest`。 2. 保持扁平文件结构,避免为当前规模创建多层基础设施目录。 3. `db.py` 提供直白函数:获取数据目录、取得默认数据库路径、打开连接、初始化数据库。 4. `db_schema.py` 使用按版本排列的 SQL 语句元组;迁移逐版本在事务中执行,成功后更新 `user_version`。 5. 数据表、字段、约束和索引严格采用 `docs/client/03-data-model.md`。 6. 测试全部使用 `TemporaryDirectory`,保证重复运行且不污染真实数据。 预计修改: - `client/src/db.py` - `client/src/db_schema.py` - `client/test/test_db.py` ## 验收标准 - [x] 自定义路径首次初始化能创建父目录和数据库文件; - [x] v1 初始化创建四张表和文档规定的索引; - [x] `PRAGMA user_version` 初始化为 1; - [x] 重复初始化不报错且不重复迁移; - [x] 新连接启用外键、WAL 和 5000 ms busy timeout; - [x] task type、status、金额、数量等 CHECK 约束生效; - [x] task_runs 和 outbox_events 外键约束生效; - [x] 高于程序支持版本的数据库会明确报错,不会降级或重建; - [x] 测试只使用临时数据库; - [x] 语法检查、unittest 和 `git diff --check` 通过。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m py_compile src/db.py src/db_schema.py test/test_db.py C:/Python310/python.exe -m unittest discover -s test -p "test_*.py" ```
Author
Owner

状态:进行中。按用户确认采用 client/src 扁平代码文件、client/test 测试目录,并优先保证初级程序员容易理解和维护。

状态:进行中。按用户确认采用 `client/src` 扁平代码文件、`client/test` 测试目录,并优先保证初级程序员容易理解和维护。
Author
Owner

实施完成,等待用户验收

  • 新增 src/db.py:数据目录、默认路径、独立连接和顺序迁移;
  • 新增 src/db_schema.py:v1 四张表、CHECK/外键约束及索引;
  • 新增 test/test_db.py:全部使用临时数据库;
  • 未引入 ORM 或任何第三方依赖,也未创建真实 client/data/client.db。

验证:语法检查通过;6 个 unittest 全部通过;git diff --check 通过。

实现提交:69f0812。归档提交:d64ebef。本地归档:docs/task/7-实现-sqlite-初始化与-v1-迁移.md。

工单保持打开,等待用户验收。后续任务再定义 Python 任务模型和 Repository。

## 实施完成,等待用户验收 - 新增 `src/db.py`:数据目录、默认路径、独立连接和顺序迁移; - 新增 `src/db_schema.py`:v1 四张表、CHECK/外键约束及索引; - 新增 `test/test_db.py`:全部使用临时数据库; - 未引入 ORM 或任何第三方依赖,也未创建真实 `client/data/client.db`。 验证:语法检查通过;6 个 unittest 全部通过;`git diff --check` 通过。 实现提交:`69f0812`。归档提交:`d64ebef`。本地归档:`docs/task/7-实现-sqlite-初始化与-v1-迁移.md`。 工单保持打开,等待用户验收。后续任务再定义 Python 任务模型和 Repository。
Author
Owner

用户已确认验收通过。本工单完成,现关闭。

用户已确认验收通过。本工单完成,现关闭。
ila closed this issue 2026-08-06 16:13:00 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#7