一、你是不是也烦透了在终端和 GUI 之间来回切换?
想象一下这个场景:
你正在写代码,突然想查一下数据库里某个表的数据。于是你:
- 打开 DBeaver / pgAdmin / DataGrip(加载 3 秒)
- 点开连接 → 展开数据库 → 找到 schema → 找到表
- 右键 → “View Data” → 等待加载
- 哦,数据不对?再写个 SQL 过滤一下
- 回到 IDE,继续 coding
- 5 分钟后又想查另一个表……重复以上步骤
你的手指在键盘和鼠标之间疯狂横跳,上下文切换成本高得离谱,效率直接打五折。
更别提那些重量级 GUI 工具——动辄几百 MB 内存占用,启动慢如蜗牛,界面花里胡哨但核心功能反而不好用。
这时候,你是不是也幻想过:能不能就在终端里,用键盘搞定一切?
好消息是——有人替你实现了这个梦想。
今天要介绍的,就是一款刚刚崭露头角、但潜力巨大的开源工具:lazypg。
它是一个用 Go 语言写的 PostgreSQL 终端 UI(TUI)工具,基于大名鼎鼎的 Bubble Tea 框架构建。名字里的 “lazy” 不是“懒惰”,而是“高效偷懒”——用最少的操作,完成最多的任务。
它的口号很直白:Stay in your terminal. Respect your muscle memory. Get out of your way.
听起来是不是有点像那个著名的 Git TUI 工具 lazygit?没错!lazypg 正是受 lazygit 启发而生,专为 PostgreSQL 开发者打造。
下面,就让我们一起走进这个“懒人神器”的世界。
二、lazypg 是什么?它能做什么?
简单来说,lazypg 就是一个运行在终端里的 PostgreSQL 客户端。但它不是 psql 那种纯命令行交互,而是带图形界面(虽然是字符界面)的可视化工具。
核心功能一览:
- ✅ 数据库导航:以树形结构浏览 databases → schemas → tables,支持展开/折叠
- ✅ 实时搜索过滤:按
/ 输入关键词,表格数据实时过滤
- ✅ JSONB 查看器:自动格式化 JSONB 字段,支持树形展开和复制查询片段
- ✅ SQL 编辑器:内置编辑器写 SQL,结果以 tab 形式展示,支持多查询并行
- ✅ 命令面板(Command Palette):
Ctrl+K 快速跳转、执行命令、搜索表
- ✅ Vim 式快捷键:
hjkl 移动、gg/G 跳转首尾、Ctrl+D/U 翻页
- ✅ 收藏常用查询:把高频 SQL 保存为“Favorites”,一键调用
- ✅ 自动发现本地 PostgreSQL 实例:省去手动输入连接信息的麻烦
- ✅ 鼠标支持:不想用键盘?点点点也行(虽然不推荐 😏)
最惊艳的是——所有操作几乎都可以用键盘完成,无需碰鼠标。对于常年泡在终端里的开发者来说,这简直是“无缝衔接”。
看个动图感受下:

是不是有种“在终端里玩 GUI”的错觉?但其实它完全运行在你的 iTerm2 / Terminal / Windows Terminal 里,零依赖、零浏览器、零 Electron。
三、技术内幕:为什么用 Go + Bubble Tea?
很多人会问:为什么不直接用 Python 或 Rust 写?为什么选 Bubble Tea?
这就要从 lazypg 的设计哲学说起。
1. Go:简洁、高效、部署方便
Go 语言天生适合写 CLI/TUI 工具:
- 编译成单个二进制文件:用户下载即用,无需安装运行时
- 并发模型优秀:处理数据库连接、UI 渲染、用户输入等异步任务游刃有余
- 生态成熟:PostgreSQL 驱动 pgx 性能极佳,远超标准库
lazypg 使用 pgx 作为底层驱动,这意味着它能充分利用 PostgreSQL 的高级特性(比如 JSONB、COPY、监听通知等),同时保持高性能。
2. Bubble Tea:TUI 开发的“瑞士军刀”
Bubble Tea 是由 Charm 团队开发的 Go TUI 框架,灵感来自 Elm 架构(Model-Update-View)。作为一款优秀的 开源实战 项目,它为 lazypg 提供了坚实的 UI 基础。
它的核心思想是:
- 状态驱动 UI:所有 UI 变化都源于状态更新
- 事件循环清晰:用户输入、定时器、异步任务统一处理
- 组件化设计:可复用的 UI 元素(如列表、输入框、表格)
举个简单例子,lazypg 中的“表数据视图”可能这样实现:
type TableView struct {
rows []Row
selected int
filter string
}
func (m *TableView) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
switch msg.String() {
case "j":
m.selected++
case "/":
return m, textinput.New().Focus()
}
}
return m, nil
}
func (m *TableView) View() string {
// 渲染过滤后的表格
var s strings.Builder
for i, row := range m.rows {
if !strings.Contains(row.String(), m.filter) {
continue
}
if i == m.selected {
s.WriteString("➤ " + row.String())
} else {
s.WriteString(" " + row.String())
}
}
return s.String()
}
这种模式让代码逻辑清晰、易于测试和扩展。lazypg 的整个 UI 就是由多个这样的“组件”拼接而成。

3. 鼠标支持?靠 bubblezone!
你可能会惊讶:终端程序还能支持鼠标点击?
答案是:可以!借助 bubblezone,lazypg 能在特定区域注册鼠标事件。
比如双击一个表名,自动展开;点击分页按钮,翻页。虽然 Vim 用户可能嗤之以鼻,但对新手或偶尔使用的人来说,鼠标是友好的“逃生舱”。
四、实战:5 分钟上手 lazypg
光说不练假把式。下面我们来实操一把。
第一步:安装
lazypg 支持多种安装方式,推荐 Homebrew(macOS/Linux):
brew install rebelice/tap/lazypg
或者用 Go 直接安装(需 Go 1.24+):
go install github.com/rebelice/lazypg@latest
也可以从 Releases 页面下载预编译二进制。
第二步:启动
终端输入:
lazypg
首次启动会看到一个空界面,因为还没连接数据库。
第三步:连接数据库
按 c 键,弹出连接对话框。
- 如果你本地有 PostgreSQL(比如通过 Docker 或 brew 安装),lazypg 会自动发现并列出
- 也可以手动输入连接字符串:
host=localhost port=5432 user=postgres dbname=mydb
按回车连接。
第四步:浏览数据
连接成功后,左侧会出现数据库树形结构:
mydb
└── public
├── users
├── orders
└── products
用 j/k 上下移动,Enter 展开/选择表。
选中 users 表后,右侧会显示前 100 行数据(默认 limit 100)。
第五步:搜索与过滤
假设你想找邮箱包含 @gmail.com 的用户:
- 确保焦点在数据面板(按
Tab 切换)
- 按
/ 键
- 输入
@gmail.com
- 数据实时过滤!
按 Esc 清除搜索。
第六步:查看 JSONB 字段
如果某列是 JSONB 类型(比如 profile 字段),将光标移到该单元格,按 j 键。
会弹出一个格式化的 JSON 查看器,支持展开嵌套对象、复制路径(如 profile->'address'->>'city')。

第七步:写 SQL 查询
按 Ctrl+E 打开 SQL 编辑器。
输入:
SELECT id, name, created_at
FROM users
WHERE created_at > '2025-01-01'
ORDER BY created_at DESC;
按 Ctrl+S 执行,结果会在新 tab 中显示。
你可以同时打开多个查询 tab,用 [ 和 ] 切换。
第八步:收藏查询
写了个好用的查询?按 f 保存为 Favorite。
下次按 Ctrl+K,输入“favorites”,就能快速调用。
五、配置与定制:让它更“懂你”
lazypg 的配置文件位于 ~/.config/lazypg/config.yaml。
默认配置如下:
ui:
theme: "default"
mouse_enabled: true
panel_width_ratio: 25 # 左侧面板占 25%
general:
default_limit: 100 # 默认查询 limit
performance:
query_timeout: 30000 # 查询超时 30 秒
你可以:
- 关闭鼠标支持(
mouse_enabled: false)
- 调整左侧面板宽度(比如 30%)
- 修改默认 limit(避免大表卡死)
- 更换主题(未来会支持更多配色)
连接历史和收藏夹也会自动保存到同目录下的 connection_history.yaml 和 favorites.yaml。
六、为什么 lazypg 值得你关注?
现在市面上 PostgreSQL 客户端不少,为什么 lazypg 有戏?
1. 精准定位:终端原住民的刚需
它不做大而全,只解决一个痛点:让终端用户高效操作 PostgreSQL。
没有花哨的 ER 图、没有复杂的权限管理、没有报表导出——这些 GUI 工具擅长的事,它统统不做。专注、克制、高效。
2. Vim 用户的天堂
如果你习惯 hjkl 移动、gg/G 跳转、/ 搜索,lazypg 几乎零学习成本。你的肌肉记忆就是它的操作手册。
3. 轻量 & 快速
启动速度秒杀所有 Electron 应用。内存占用通常 <50MB。这才是终端工具该有的样子。
4. 开源 & 可扩展
项目刚起步(GitHub 45 stars),但架构清晰,社区友好。如果你有想法,完全可以 PR 一个功能。
比如:
- 支持 SSH 隧道连接
- 导出 CSV/JSON
- 表结构对比
- 查询执行计划可视化
这些都在 Roadmap 中规划。

七、适用场景 vs 不适用场景
✅ 适合你,如果:
- 你每天在终端工作 ≥4 小时
- 你讨厌在 IDE 和 GUI 之间切换
- 你常用 Vim/Neovim
- 你需要快速查看/验证数据
- 你在远程服务器上操作 DB(无 GUI 环境)
❌ 不适合你,如果:
- 你需要画 ER 图做数据库设计
- 你要给非技术人员演示数据
- 你重度依赖鼠标操作
- 你需要复杂的报表或 BI 功能
lazypg 不是 pgAdmin 的替代品,而是 psql 的增强版。
八、未来展望:TUI 工具的春天来了?
lazypg 的出现,其实是更大趋势的一部分:开发者越来越重视“上下文一致性”。
我们不再愿意为了一个小操作跳出当前环境。无论是:
- 用 lazygit 管理 Git
- 用 btop 查看系统资源
- 用 nnn 浏览文件
- 用 glow 阅读 Markdown
终端正在变成一个完整的生产力平台。
而 Go + Bubble Tea 的组合,正成为构建这类工具的黄金搭档。性能、简洁、跨平台——完美契合开发者需求。
或许不久的将来,我们会看到:
- lazysql(MySQL 版)
- lazyredis
- lazyclickhouse
甚至一个统一的“lazy-suite”。
结语:懒,是一种美德
最后回到标题:“懒人福音”。
这里的“懒”,不是指什么都不做,而是拒绝无效劳动,追求极致效率。
lazypg 让你少点一次鼠标,少切一次窗口,少等一秒加载——日积月累,就是巨大的时间红利。
如果你也厌倦了在终端和 GUI 之间疲于奔命,不妨试试 lazypg。更多类似的开发效率工具讨论,欢迎来 云栈社区 的技术板块交流。
GitHub 地址:https://github.com/rebelice/lazypg