Skip to content

Repository files navigation

Datum

一款简约现代的桌面数据库管理工具,支持 PostgreSQLRedis 等种数据库。基于 Tauri 2 + React + TypeScript 构建,体积小、启动快。

image image

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

兼容 Intel Mac(通用包,可选)

rustup target add x86_64-apple-darwin
npm run tauri build -- --target universal-apple-darwin

发版流程

App 内置应用内更新:左下角状态栏显示当前版本;顶栏齿轮打开 设置 → 关于与更新 → 检查更新,发现新版本后可直接在 App 内下载、安装并重启完成升级(下载 zip_url 指向的 .app 包,原地替换后重启)。若 latest.json 没有 zip_url,则回退为浏览器打开 url 下载 DMG。

⚠️ App 判断"有没有新版"靠的是 main 上的 latest.json(经 GitLab Pages 发布,见文末前提),不是 GitLab Release。所以每次发版必须更新并提交 latest.jsonmain,否则 App 检查不到新版本。

latest.json 字段:

{
  "version": "0.3.0",                 // 最新版本号(semver)
  "url": "<DMG 下载直链>",             // 无 zip_url 时浏览器打开的下载地址
  "zip_url": "<.app zip 下载直链>",    // 应用内自更新包(release:mac 第 5 步产物)
  "notes": "本次更新内容"              // 可选,展示在「关于与更新」里
}

步骤

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.ymlpages 任务会自动把 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.rsUPDATE_MANIFEST_URL)。私有项目的 raw 地址会 302 到登录页,App 拉不到;所以 .gitlab-ci.ymlpages 任务在 latest.json 推到 main 后自动把它发布到 Pages。本实例的 Pages 未启用访问控制,部署即匿名可达(已实测);若日后实例开启了 Pages 访问控制,需在项目设置里把 Pages 设为 Everyone。
  • DMG 与 zip 下载直链同理要能免登录下载(实测 pub.lbkrs.com 可用),否则应用内更新会报下载失败。

安装与使用

已签名包(release:mac 产物)

双击 Datum_<版本>_aarch64.dmg,把 Datum 拖进 Applications,直接双击打开即可,无需任何额外步骤。

未签名包(tauri build 产物,仅自测)

首次打开会提示"已损坏"或"来自身份不明的开发者"——这是因为未做苹果签名,并非真的损坏。执行一次以下命令解除隔离标记后即可打开:

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/         设计文档与实现计划

About

一款简约现代的桌面数据库管理工具,支持 PostgreSQL 与 Redis。基于 Tauri 2 + React + TypeScript 构建,体积小、启动快。

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages