dbtool-tui Shell
apps/tui 提供 dbtool-tui-v1 的终端工作台实现。
当前范围
当前实现包含:
- 独立
dbtool-tui应用入口 - 稳定的六区工作台布局
- 顶部视图切换与底部快捷键提示
- 连接管理列表、当前连接上下文和失败连接可视化区分
- 键盘驱动的连接切换工作流,以及连接
loading / success / failure可视状态 sqlite-local的真实 connect / inspect 路径,schema browser 可展示 live schema / table / columnsqlite-local的真实 query / results / export 工作流,直接复用crates/db-app- PostgreSQL / MySQL 的 Docker demo live activation / query / export 路径
- 查询草稿切换、基础键入编辑、执行触发与执行状态反馈
- 成功 / 空结果 / 错误三类查询结果展示,以及宽表列分页提示
- 当前结果集导出到
/tmp的 CSV / JSON 反馈 - 面板焦点管理
- 列表选择与基础键盘导航
Ready/Loading/Error三种基础界面状态- 终端尺寸过小的显式降级提示
当前不包含:
- 多连接并发会话
- 自定义新增 / 编辑连接表单
- 非 demo 自定义 network profile
- 完整 SQL 编辑器能力
usable-v1 口径边界
当前 TUI 能力要按三层结论理解,避免把局部 live path 误记为整体通过:
| 层级 | 当前结论 | 含义 |
|---|---|---|
| shell baseline | pass |
六区布局、焦点、状态、TTY 启动与退出可直接复核 |
sqlite-local local live |
partial |
单机会话内可复核 connect / inspect / query / export,但只覆盖本地 SQLite |
| PostgreSQL / MySQL network live | pass |
当前 runner 可通过 host.docker.internal、Docker demo 容器与 TTY smoke 脚本复核真实激活、查询、导出 |
sqlite-local仍是最轻量的本地单机验证入口,但不再是唯一 live 路径。- 当前 usable-v1 的 runner 内 network live 回放口径已经建立,可直接复核 PostgreSQL / MySQL。
- QA 在对外汇报时,应明确写成“shell baseline = pass、
sqlite-local= partial、PostgreSQL/MySQL network live = pass(demo path)”。
运行方式
在项目根目录执行:
cargo run -p dbtool-tui
当前默认 live 路径是 sqlite-local,底层使用 examples/tmp/dbtool-demo.sqlite。
启动后会自动对 sqlite-local 执行 connect + inspect;切换连接时会重新触发 live activation。
内置 reporting-postgres / orders-mysql profile 默认走 host.docker.internal:55432/53306,并分别复用 dbtool_demo / qa_demo demo 数据。
如果当前 runner 缺少 Rust 工具链,可先使用已有产物:
./target/debug/dbtool-tui
TTY smoke 契约
dbtool-tui需要交互式 TTY;正常终端启动与自动化 smoke 都必须走 TTY 路径。- 当前最小可重复入口:
scripts/tui/smoke-tty.sh ./target/debug/dbtool-tui
- PostgreSQL live smoke:
export DBTOOL_PASSWORD=dbtool
scripts/tui/live-network-smoke.sh postgres ./target/debug/dbtool-tui
- MySQL live smoke:
export DBTOOL_PASSWORD=dbtool
scripts/tui/live-network-smoke.sh mysql ./target/debug/dbtool-tui
- 小终端降级入口:
scripts/tui/smoke-tty.sh ./target/debug/dbtool-tui 20 90 /tmp/dbtool-tui-small.log
./target/debug/dbtool-tui --help不是有效 smoke;当前它只用于确认“非 TTY 会被明确拒绝”这一限制。- 共享 runbook 见
TUI_SMOKE_RUNBOOK.md。
键盘交互
Tab/Shift+Tab:切换焦点面板←/→或1/2/3:切换顶部视图↑/↓:移动连接、schema/object 或结果行选择Enter:在Connections焦点下激活所选连接;在Schema Browser焦点下展开 / 折叠 schema 或确认对象;在Query Editor焦点下执行当前查询i:在Query Editor中进入基础插入模式x:将当前结果集导出为 CSV 到/tmpj:将当前结果集导出为 JSON 到/tmp[/]:在Query Editor中切换查询草稿;在Results中横向翻页宽表列r:清空当前 query / export 反馈,回到ReadyEsc:回到默认工作台q:退出
状态恢复与键位一致性
Esc在两个场景下都承担“回到稳定态”的职责:编辑模式下先退回 navigate mode;普通导航下回到默认Workspace+Query Editor焦点。r是唯一的显式恢复键:会同时清空 query 结果、query 错误、export 成功/失败反馈,并把界面状态收口回Ready。[/]只在两个焦点区生效:Query Editor下切换草稿,Results下横向翻页;其他面板按下不会触发隐藏状态变化。x/j只在当前工作区已有“成功且可导出”的结果集时成立;若查询仍在运行或当前没有可导出结果,会保留明确错误/提示,而不是静默失败。Enter的语义由当前焦点决定:Connections= 激活连接,Schema Browser= 展开/确认对象,Query Editor= 执行查询;插入模式下Enter只插入换行。
快速测试路径
如果你只是想快速走通一遍当前可见工作流,推荐按下面步骤操作:
- 启动
cargo run -p dbtool-tui - 等待默认连接
sqlite-local从Loading变成可用状态 - 按
Tab把焦点切到Schema Browser - 用
↑/↓选择main.accounts或main.tickets - 按
Tab切到Query Editor - 先不要按
i,直接按[/]切换草稿 - 选中
account_ticket_summary.sql后按Enter,确认成功结果 - 切到
empty_recent_tickets.sql后按Enter,确认空结果 - 切到
bad_syntax.sql后按Enter,确认错误结果持续留在工作区 - 切到
ticket_export_preview.sql后按Enter,成功后按x或j,确认导出反馈和/tmp路径
常见困惑
Inserted a newline. Press Esc, then Enter to run.:表示你已经按了i进入编辑模式,然后按了Enter;这时Enter不会执行查询,而是插入换行。按Esc退出编辑模式后,再按Enter才是执行查询。- 当前不能自定义输入数据库连接:这是当前范围外能力。当前 TUI 只提供内置的
sqlite-local、Postgres、MySQL 示例连接,用于验证工作台流程和状态反馈。 - 如果觉得界面文字偏多:本轮已先做一轮 Help / Status / Connections 文案收敛;当前版本仍偏向 QA / 契约验证界面,后续再继续收敛文案。
界面验收
QA 可按以下步骤复核:
- 启动后能看到
Connections、Schema Browser、Query Editor、Results、Inspector、Status & Activity六个区域 - 默认活动连接应为
sqlite-local,且Connections列表中能区分当前连接、可选连接和失败连接 - 使用
2进入Connections视图后,可用↑/↓移动连接选择 - 在
Connections焦点下按Enter激活失败连接时,Status & Activity与Inspector会持续显示可读错误,而不是只给瞬时提示 - 启动后或回到
sqlite-local后,连接状态会先进入Loading,随后在Schema Browser焦点下可浏览main.accounts和main.tickets - 选中对象后,
Results会展示列定义,Inspector会展示当前 schema / object / column 上下文 - 在
Query Editor焦点下可用[/]切换查询草稿,i进入基础输入模式,Enter触发执行 account_ticket_summary.sql应返回真实结果行,empty_recent_tickets.sql应显示空结果,bad_syntax.sql应显示结构化错误ticket_export_preview.sql执行成功后,按x或j应在工作区内看到导出成功反馈和/tmp输出路径- 成功结果在
Results中以表格方式展示,宽表会给出列分页提示,长结果仍可用↑/↓浏览 - 错误状态会保留可读错误信息,不退化成空白或瞬时提示
- 使用
Tab/Shift+Tab时,当前焦点区域边框高亮会移动 - 使用
←/→或1/2/3时,中间内容区会随视图切换 - 使用
r时,query / export 反馈会清空并回到Ready - 将终端缩小到低于
100x28时,会出现尺寸不足提示而不是错乱布局 - 使用
Esc可恢复默认工作台,使用q可稳定退出
当前限制
sqlite-local仍是当前最快的本地 runner live connect / inspect / query / export 路径- Postgres / MySQL 当前默认指向 Docker demo 容器;若 demo stack 未启动,会回退为可读失败态
- 当前 runner 若缺少
cargo,需要使用已有二进制做交互 smoke;源码重建与测试需在具备 Rust 工具链的环境完成 - 非 TTY 启动当前会明确报错并退出;这是已记录限制,不是可支持的帮助命令路径
共享 QA 文档:
TUI_ACCEPTANCE_CHECKLIST.mdTUI_SMOKE_RUNBOOK.mdTUI_TEST_STRATEGY.mdTUI_REGRESSION_CHECKLIST.md