一款简约现代的桌面数据库管理工具,支持 PostgreSQL 与 Redis 等种数据库。基于 Tauri 2 + React + TypeScript 构建,体积小、启动快。
Datum(/ˈdeɪtəm/,"data" 的单数)—— 专注于数据的工具。
- 连接管理:新建/编辑/删除连接,按环境(local / staging / prod)着色;凭据按环境路由——
local明文存本地、staging/prod存 macOS 钥匙串 - PostgreSQL:浏览表、SQL 编辑器(关键字自动大写、运行选中或光标所在语句)、结果表格(固定表头、列宽省略、双击看全文、行高亮、分页)、表详情(字段定义 + 索引)、暂存-确认事务编辑、查看建表语句、复制 INSERT
- Redis:浏览 key、按类型(string/hash/list/set/zset)展示值、执行任意命令、查看 key 详情(类型/TTL/大小)
- 界面:Ayu Light / Mirage 双主题(☀️/🌙 一键切换)、可拖动三栏布局、多标签页、统一提示
- 桌面框架:Tauri 2(Rust 后端 + 系统 WebView)
- 前端:React 18 + TypeScript + Vite,SQL 编辑器用 CodeMirror 6,布局用 react-resizable-panels,状态用 Zustand
- 后端驱动:PostgreSQL 用
tokio-postgres,Redis 用redis-rs,凭据用keyring
- Node.js ≥ 20(开发用 v24 验证)
- Rust ≥ 1.80(开发用 1.95 验证),含
cargo - macOS(当前打包目标;Tauri 本身跨平台)
- 跑后端集成测试时需要 Docker(或本地可连的 PostgreSQL / Redis)
首次没有 Rust 时安装:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# 1. 安装前端依赖
npm install
# 2. 启动开发模式(热重载,自动编译 Rust 后端并打开窗口)
npm run tauri dev常用脚本:
npm run dev # 只起前端 Vite(不含桌面外壳)
npm run build # 前端 tsc 类型检查 + 构建到 dist/
npm test # 前端单元测试(Vitest)Rust 单元测试:
cd src-tauri && cargo test集成测试默认标记 #[ignore],只在显式运行时执行,会自行建表/种数据并清理。
# PostgreSQL:默认连 127.0.0.1:5432(postgres/postgres),或起一个 docker 实例
src-tauri/scripts/test-pg.sh
cd src-tauri && cargo test -- --ignored --test-threads=1
# Redis:默认连 127.0.0.1:6379
src-tauri/scripts/test-redis.sh
cd src-tauri && cargo test rds:: -- --ignored可用环境变量覆盖测试连接:DBSTUDIO_TEST_PG(libpq 连接串)、DBSTUDIO_TEST_REDIS(redis URL)。
有两种打包方式,按用途选:
| 命令 | 产物 | 用途 |
|---|---|---|
npm run tauri build |
未签名 DMG | 本机自测、调试。别人下载会被 Gatekeeper 拦 |
npm run release:mac |
已签名 + 公证的 DMG | 正式对外发布,别人下载双击即开 |
两者产物都在 src-tauri/target/release/bundle/:
dmg/Datum_<版本>_aarch64.dmg—— 安装包(拖进 Applications 即装)macos/Datum.app—— 应用本体
⚠️ 两种方式产物路径相同。要发布给别人,请认准跑完release:mac、末尾打印staple 校验通过 ✅的那个包,别把未签名包发出去。
当前在 Apple Silicon 上构建,产物为
aarch64,仅适用于 M 系列 Mac。
npm run release:mac 会自动完成 构建 → 签名 → 公证 → 装订 → 校验。产物经 Apple 公证,用户下载后可直接打开,无需手动绕过 Gatekeeper。
前提是本机已配置签名环境。换一台新打包机时,先跑一次一次性配置(需向项目负责人索取签名身份文件 DeveloperID-datum.p12 及其密码、以及 Apple App 专用密码):
bash src-tauri/scripts/setup-signing.sh /path/to/DeveloperID-datum.p12完整说明见 docs/signing.md。
rustup target add x86_64-apple-darwin
npm run tauri build -- --target universal-apple-darwinApp 内置应用内更新:左下角状态栏显示当前版本;顶栏齿轮打开 设置 → 关于与更新 → 检查更新,发现新版本后可直接在 App 内下载、安装并重启完成升级(下载 zip_url 指向的 .app 包,原地替换后重启)。若 latest.json 没有 zip_url,则回退为浏览器打开 url 下载 DMG。
⚠️ App 判断"有没有新版"靠的是main上的latest.json(经 GitLab Pages 发布,见文末前提),不是 GitLab Release。所以每次发版必须更新并提交latest.json到main,否则 App 检查不到新版本。
latest.json 字段:
1. 改版本号(四处一起改)
| 文件 | 字段 |
|---|---|
package.json |
version |
src-tauri/tauri.conf.json |
version |
src-tauri/Cargo.toml |
version |
latest.json |
version(url / zip_url 待上传后回填) |
2. 构建签名 + 公证的 DMG 与自更新 zip
npm run release:mac产物:
src-tauri/target/release/bundle/dmg/Datum_<版本>_aarch64.dmg(手动安装)src-tauri/target/release/bundle/macos/Datum_<版本>_aarch64.app.zip(应用内自更新包,staple 后打包)
3. 上传 DMG 与 zip,拿免登录直链
把两个产物上传到公开文件服务(如 pub.lbkrs.com),分别拿到直链。
注意:不要用 GitLab Release 的资产链接——项目是私有的,匿名下载会被重定向到登录页,应用内更新会报「下载失败」。GitLab Release 可以照常建(打 tag 存档),但
latest.json里要填公开直链。
4. 回填 latest.json,提交到 main
把 version 和上一步的两个直链填进 latest.json(url=DMG、zip_url=zip),然后:
git add latest.json && git commit -m "chore(release): latest.json 0.2.1" && git push origin main推到 main 后,.gitlab-ci.yml 的 pages 任务会自动把 latest.json 重新发布到 Pages;Pages 前有约 10 分钟缓存(max-age=600),缓存过期后用户在「设置 → 关于与更新」点检查更新即可升级。
5. 验证
curl -sL https://craft.pages.longbridge-inc.com/datum/latest.json确认返回的 version / zip_url 是新值(缓存未过期时会短暂看到旧值),再用旧版本 App 实际走一遍 检查更新 → 立即更新 → 重启。
latest.json经 GitLab Pages 发布(https://craft.pages.longbridge-inc.com/datum/latest.json,写死在src-tauri/src/update.rs的UPDATE_MANIFEST_URL)。私有项目的 raw 地址会 302 到登录页,App 拉不到;所以.gitlab-ci.yml的pages任务在latest.json推到main后自动把它发布到 Pages。本实例的 Pages 未启用访问控制,部署即匿名可达(已实测);若日后实例开启了 Pages 访问控制,需在项目设置里把 Pages 设为 Everyone。- DMG 与 zip 下载直链同理要能免登录下载(实测
pub.lbkrs.com可用),否则应用内更新会报下载失败。
双击 Datum_<版本>_aarch64.dmg,把 Datum 拖进 Applications,直接双击打开即可,无需任何额外步骤。
首次打开会提示"已损坏"或"来自身份不明的开发者"——这是因为未做苹果签名,并非真的损坏。执行一次以下命令解除隔离标记后即可打开:
xattr -dr com.apple.quarantine /Applications/Datum.app仅支持 Apple Silicon(M 系列)Mac;Intel Mac 需使用上面的通用包构建。
- PostgreSQL:新建连接,类型选 PostgreSQL,填主机/端口(默认 5432)/用户/数据库/密码
- Redis:类型选 Redis,填主机/端口(默认 6379)/库索引(默认 0),密码可留空
凭据存储:local 环境的密码以明文存于配置文件,staging/prod 环境的密码存入 macOS 钥匙串。配置文件位于:
~/Library/Application Support/com.dbstudio.app/connections.json
src/ 前端(React + TS)
api/ 调用后端命令的封装(connections / pg / redis)
components/ UI 组件(连接列表、SQL 编辑器、结果表格、表详情、Toast 等)
lib/ 纯函数(SQL 生成、语句切分、剪贴板)
state/ Zustand 全局状态
theme/ Ayu 主题 token 与切换
src-tauri/ 后端(Rust + Tauri)
src/core/ 连接模型、按环境的凭据存储、配置仓库、错误类型
src/pg/ PostgreSQL:连接池、浏览、编辑、命令
src/rds/ Redis:连接、scan、取值、命令
src/commands.rs 连接 CRUD 的 Tauri 命令
src/lib.rs 应用入口与命令注册
docs/superpowers/ 设计文档与实现计划
{ "version": "0.3.0", // 最新版本号(semver) "url": "<DMG 下载直链>", // 无 zip_url 时浏览器打开的下载地址 "zip_url": "<.app zip 下载直链>", // 应用内自更新包(release:mac 第 5 步产物) "notes": "本次更新内容" // 可选,展示在「关于与更新」里 }