LAZYSQL
一个使用 Go 编写的跨平台 TUI 数据库管理工具。
关于本项目

本项目深受 Lazygit 的启发,我认为它是最好的 Git TUI 客户端。
我想要一个类似这样的工具,但用于 SQL。我没有找到符合我需求的工具,所以我自己创建了一个。
我生活在终端中,所以如果你和我一样,这个工具对你也会有用。
这也是我的第一个开源项目,同时这也是我的第一个 Go 项目。我不是一个天才程序员。我只是一个典型的 JavaScript 开发者,想要学习一门新语言,我还想要一个 TUI SQL 客户端,所以 blanca y en botella, leche!(白色且装瓶,牛奶!)。
本项目处于 ALPHA 阶段,请随意抱怨我的意大利面代码。
我在日常工作中使用 Lazysql,我是一名全职的全栈 JavaScript 开发者,目前(有 bug xD)的状态下。因此,计划是在空闲时间作为一个副项目来改进和修复我的小宝贝。
构建工具
功能
- 跨平台(macOS, Windows, Linux)
- Vim 键位绑定
- 可以管理多个连接(Backspace)
- 标签页
- SQL 编辑器(CTRL + e)
快速开始
安装
Homebrew (macOS/Linux)
brew install lazysql
使用 go 包管理器安装
go install github.com/jorgerojas26/lazysql@latest
二进制发布版
对于 Windows、macOS 或 Linux,您可以在此处下载二进制发布版 here
第三方(由社区维护)
Arch Linux 用户可以通过 AUR 安装:
paru -S lazysql
或
yay -S lazysql
或手动安装,命令如下:
git clone https://aur.archlinux.org/lazysql.git
cd lazysql
makepkg -si
(返回顶部)
配置
如果设置了 XDG_CONFIG_HOME 环境变量,则配置文件将位于:
${XDG_CONFIG_HOME}/lazysql/config.toml
否则,配置文件将位于:
- Windows:
%APPDATA%\lazysql\config.toml - macOS:
~/Library/Application Support/lazysql/config.toml - Linux:
~/.config/lazysql/config.toml
配置文件是一个 TOML 文件,可用于定义多个连接。
配置示例
[[database]]
Name = 'Production database'
Provider = 'postgres'
DBName = 'foo'
URL = 'postgres://${user}:urlencodedpassword@localhost:${port}/foo'
ReadOnly = true
Commands = [
{ Command = 'ssh -tt remote-bastion -L ${port}:localhost:5432', WaitForPort = '${port}' },
{ Command = 'whoami', SaveOutputTo = 'user' },
]
[[database]]
Name = 'Development database'
Provider = 'postgres'
DBName = 'foo'
URL = 'postgres://postgres:urlencodedpassword@localhost:5432/foo'
[application]
DefaultPageSize = 300
DisableSidebar = false
SidebarOverlay = false
JSONViewerWordWrap = false
EnterOpensJSONViewer = false
ReadOnly 字段(可选,默认为 false)可以设置为 true 以启用连接的只读模式。启用后,所有变更查询(INSERT、UPDATE、DELETE、DROP 等)将被阻止。
[application] 部分用于定义一些应用设置。并非所有设置都已可用,此功能仍在开发中。
应用设置
| 设置 | 默认值 | 描述 |
|---|---|---|
| DefaultPageSize | 300 | 每页获取的记录数 |
| DisableSidebar | false | 禁用侧边栏 |
| SidebarOverlay | false | 以覆盖层形式显示侧边栏,而非侧面板 |
| JSONViewerWordWrap | false | 在 JSON 查看器中启用自动换行 |
| EnterOpensJSONViewer | false | 在单元格上按 Enter 键时打开 JSON 查看器 |
本地配置
您可以在项目目录中(与 .git 文件夹同级)放置一个 .lazysql.toml 文件,以覆盖该项目的全局配置。这对于定义项目特定的数据库连接或设置非常有用。
lazysql 通过从当前工作目录向上遍历来查找 .lazysql.toml。它会在 git 仓库根目录(即找到 .git 的位置)处停止。如果未找到本地配置,则直接使用全局配置。
合并行为:
| 部分 | 行为 |
|---|---|
[application] | 深度合并 — 本地值覆盖全局值,未设置的字段保留全局值/默认值 |
[[database]] | 替换 — 本地连接完全替换全局连接 |
[keymap.*] | 深度合并 — 本地键绑定针对同一命令覆盖全局键绑定 |
示例 .lazysql.toml:
[application]
DefaultPageSize = 500
[[database]]
Name = 'Local development'
Provider = 'postgres'
URL = 'postgres://localhost/myproject_dev'
使用此本地配置时,DefaultPageSize 会覆盖全局值,并且只有 Local development 连接可用(全局连接将被替换)。
环境变量(${env:VAR_NAME})在本地配置文件中与在全局配置中一样有效。
注意:当找到本地 .lazysql.toml 时,从 UI 修改连接时,完整配置将保存到本地文件中。
用法
按
?查看键盘快捷键列表
使用以下命令打开 TUI:
$ lazysql
启动 lazysql 并允许从已保存的连接中进行选择。
$ lazysql [connection_url]
启动 lazysql 并连接到 [connection_url] 处的数据库。
$ lazysql --read-only [connection_url]
以只读模式启动 lazysql。
连接到数据库
- Start
lazysql - Create a new connection (press
n) - Provide a name for the connection as well as the URL to connect to (see example connection URL)
- Connect to the DB (press
<Enter>)
If you already have a connection set up:
- Start
lazysql - Select the right connection (press
jandhfor navigation) - Connect to the DB (press
cor<Enter>)
创建一个表
目前无法从 TUI 创建表。 但你可以将创建表的查询作为 SQL-Query 运行, 在 SQL Editor 中。
你可以通过按下 R 来更新树,从而查看你新创建的表。
执行 SQL 查询
- 按
<Ctrl+E>打开内置的 SQL Editor - 编写 SQL 查询
- 按
<Ctrl+R>执行 SQL 查询
按
H可切换回表格树执行
SELECT查询后,SQL 编辑器下方将显示包含查询结果的表格。
按/可将焦点切换回 SQL 编辑器
打开/查看表
- Expand the table-tree by pressing
eor<Enter> - Select the table you want to view
- next node
j - previous node
k - last node
G - first node
g
- next node
- Press
<Enter>to open the table
按
H返回表格树
按L返回表格
筛选行
- Open a table
- Press
/to focus the filter input - Write a
WHERE-clause to filter the table - Press
<Enter>to submit your filter
要移除筛选器,请聚焦筛选器输入框(按
/)并按<Esc>。
插入一行
- Open a table
- Press
1to switch to the record tab - Press
oto insert a new row - Fill out all columns
- Press
<Ctrl+S>to save the changes
编辑列
- Open a table
- Press
1to switch to the record tab - Move to the column you want to edit
- Press
cto edit, Press<Enter>to submit - Press
<Ctrl+S>to save the changes
导出为 CSV
从表格视图
- Open a table
- Apply filters or sorting as needed
- Press
Eto open the export dialog - Optionally modify the file path and batch size
- Select export scope:
- Export Current Page: Export only the currently displayed rows
- Export All Records: Fetch and export all records from the table
批处理大小(默认值:10000):在导出所有记录时,数据将分批获取,以避免大表出现超时或内存问题。增大该值可加快导出速度,若遇到任何错误则应减小该值。
默认文件路径为
~/Downloads/{database}_{table}_{timestamp}.csv。
来自 SQL 编辑器
- Execute a SQL query
- Press
Eto open the export dialog - Optionally modify the file path
- Select Export to save all query results
(返回顶部)
支持
- MySQL
- PostgreSQL
- SQLite
- MSSQL
- MongoDB
对多种 RDBMS 的支持正在开发中。
命令
在某些情况下,尤其是在连接远程数据库时,可能需要在能够连接数据库之前运行自定义命令。 例如,当你只能通过远程堡垒机访问数据库时,你可能需要先在一个单独的终端中运行以下命令 来打开一个 SSH 隧道:
ssh remote-bastion -L 5432:localhost:5432
为了更轻松地运行这些命令,lazysql 支持在连接到数据库之前运行自定义命令。您可以在配置文件中像这样定义这些命令:
[[database]]
Name = 'server'
Provider = 'postgres'
DBName = 'foo'
URL = 'postgres://${user}:password@localhost:${port}/foo'
Commands = [
{ Command = 'ssh -tt remote-bastion -L ${port}:localhost:5432', WaitForPort = '${port}' },
{ Command = 'whoami', SaveOutputTo = 'user' },
]
Command 字段是必需的,可以包含任何你通常在终端中运行的命令。
WaitForPort 字段是可选的,可用于在继续之前等待特定端口打开。
SaveOutputTo 字段是可选的,可用于创建用户定义的变量。命令的输出(stdout)将被保存到变量中,并且可以通过 ${VARIABLE} 语法在 URL 或后续命令中使用该变量。
当你在 URL 字段中定义 ${port} 变量时,lazysql 会自动将其替换为一个随机的
空闲端口号。然后,该端口号将用于连接 URL,并可在 Commands
字段中使用,以便你配置命令。
你甚至可以链接命令,例如,先连接到远程服务器,然后连接到在远程 k8s 集群中运行的 postgres 容器:
[[database]]
Name = 'container'
Provider = 'postgres'
DBName = 'foo'
URL = 'postgres://postgres:password@localhost:${port}/foo'
Commands = [
{ Command = 'ssh -tt remote-bastion -L 6443:localhost:6443', WaitForPort = '6443' },
{ Command = 'kubectl port-forward service/postgres ${port}:5432 --kubeconfig /path/to/kube.conf', WaitForPort = '${port}' }
]
环境变量
你可以在配置文件中使用 ${env:VAR_NAME} 语法来使用环境变量。这对于将密码等敏感信息排除在配置文件之外非常有用。
[[database]]
Name = 'Production'
Provider = 'postgres'
URL = 'postgres://${env:DB_USER}:${env:DB_PASSWORD}@localhost:5432/mydb'
export DB_USER=admin
export DB_PASSWORD=secret
lazysql
注意:未定义的环境变量将被替换为空字符串。
键位绑定
自定义键位绑定
你可以通过在 config.toml 文件中添加一个 [keymap.<Group>] 部分来自定义键位绑定。每个条目将一个命令名称映射到一个按键。
[keymap.Home]
SwitchToEditorView = "i"
Quit = "Esc"
[keymap.Tree]
GotoTop = "t"
Search = "Ctrl-F"
对于单字符键,直接使用字符(例如,"q"、"G"、"1"、"/")。对于特殊键,使用 tcell 键名(例如,"Enter"、"Esc"、"Ctrl-S")。仅支持 tcell 中定义的键名。
组名不区分大小写(Home、home 和 HOME 均可使用)。
可用组:Home、Connection、Tree、TreeFilter、Table、Editor、Sidebar、QueryPreview、QueryHistory、JSONViewer。
默认键绑定
主界面
| 默认键 | 命令 | 描述 |
|---|---|---|
| L | MoveRight | 聚焦表格 |
| H | MoveLeft | 聚焦树 |
| Ctrl-E | SwitchToEditorView | 打开 SQL 编辑器 |
| Ctrl-S | Save | 执行待处理的更改 |
| q | Quit | 退出 |
| Backspace | SwitchToConnectionsView | 切换到连接列表 |
| ? | HelpPopup | 帮助 |
| Ctrl-P | SearchGlobal | 全局搜索 |
| Ctrl-_ | ToggleQueryHistory | 切换查询历史模态框 |
| T | ToggleTree | 切换文件树 |
连接
| 默认键 | 命令 | 描述 |
|---|---|---|
| n | NewConnection | 创建新的数据库连接 |
| c | Connect | 连接到数据库 |
| Enter | Connect | 连接到数据库 |
| e | EditConnection | 编辑数据库连接 |
| d | DeleteConnection | 删除数据库连接 |
| q | Quit | 退出 |
树
| 默认按键 | 命令 | 描述 |
|---|---|---|
| g | GotoTop | 跳转到顶部 |
| G | GotoBottom | 跳转到底部 |
| Enter | Execute | 打开 |
| j | MoveDown | 向下移动 |
| Down | MoveDown | 向下移动 |
| Ctrl-U | PagePrev | 向上翻页 |
| Ctrl-D | PageNext | 向下翻页 |
| k | MoveUp | 向上移动 |
| Up | MoveUp | 向上移动 |
| / | Search | 搜索 |
| n | NextFoundNode | 跳转到下一个找到的节点 |
| N | PreviousFoundNode | 跳转到上一个找到的节点 |
| p | PreviousFoundNode | 跳转到上一个找到的节点 |
| P | NextFoundNode | 跳转到下一个找到的节点 |
| c | TreeCollapseAll | 折叠全部 |
| e | ExpandAll | 展开全部 |
| R | Refresh | 刷新树 |
树过滤器
| 默认按键 | 命令 | 描述 |
|---|---|---|
| Esc | UnfocusTreeFilter | 取消树过滤器焦点 |
| Enter | CommitTreeFilter | 提交树过滤器搜索 |
表格
| 默认按键 | 命令 | 描述 |
|---|---|---|
| / | Search | 搜索 |
| c | Edit | 修改单元格 |
| d | Delete | 删除行 |
| w | GotoNext | 跳转到下一个单元格 |
| b | GotoPrev | 跳转到上一个单元格 |
| $ | GotoEnd | 跳转到最后一个单元格 |
| 0 | GotoStart | 跳转到第一个单元格 |
| y | Copy | 复制单元格值到剪贴板 |
| o | AppendNewRow | 追加新行 |
| O | DuplicateRow | 复制行 |
| J | SortDesc | 降序排序 |
| R | Refresh | 刷新当前表格 |
| K | SortAsc | 升序排序 |
| C | SetValue | 切换值菜单 (NULL, EMPTY, DEFAULT) |
| [ | TabPrev | 切换到上一个标签页 |
| ] | TabNext | 切换到下一个标签页 |
| { | TabFirst | 切换到第一个标签页 |
| } | TabLast | 切换到最后一个标签页 |
| X | TabClose | 关闭标签页 |
| > | PageNext | 切换到下一页 |
| < | PagePrev | 切换到上一页 |
| 1 | RecordsMenu | 切换到记录菜单 |
| 2 | ColumnsMenu | 切换到列菜单 |
| 3 | ConstraintsMenu | 切换到约束菜单 |
| 4 | ForeignKeysMenu | 切换到外键菜单 |
| 5 | IndexesMenu | 切换到索引菜单 |
| S | ToggleSidebar | 切换侧边栏 |
| s | FocusSidebar | 聚焦侧边栏 |
| Z | ShowRowJSONViewer | 切换行的 JSON 查看器 |
| z | ShowCellJSONViewer | 切换单元格的 JSON 查看器 |
| E | ExportCSV | 导出为 CSV |
编辑器
| 默认按键 | 命令 | 描述 |
|---|---|---|
| Ctrl-R | Execute | 执行查询 |
| Esc | UnfocusEditor | 取消编辑器焦点 |
| Ctrl-Space | OpenInExternalEditor | 在外部编辑器中打开 |
可以通过 $SQL_EDITOR 为 lazysql 设置特定的编辑器。
JSON 查看器
| 按键 | 操作 |
|---|---|
| w | 切换自动换行 |
| y | 复制到剪贴板 |
| z/Z | 关闭查看器 |
可以通过在表格单元格上按 z(单元格)或 Z(行)来打开 JSON 查看器。如果启用了 EnterOpensJSONViewer,在单元格上按 Enter 键也会打开 JSON 查看器。
侧边栏
| 默认按键 | 命令 | 描述 |
|---|---|---|
| s | UnfocusSidebar | 聚焦表格 |
| S | ToggleSidebar | 切换侧边栏 |
| j | MoveDown | 聚焦下一个字段 |
| k | MoveUp | 聚焦上一个字段 |
| g | GotoStart | 聚焦第一个字段 |
| G | GotoEnd | 聚焦最后一个字段 |
| c | Edit | 编辑字段 |
| Enter | CommitEdit | 将编辑添加到待处理更改 |
| Esc | DiscardEdit | 放弃编辑 |
| C | SetValue | 切换值菜单(NULL、EMPTY、DEFAULT) |
| y | Copy | 复制值到剪贴板 |
查询预览
| 默认按键 | 命令 | 描述 |
|---|---|---|
| Ctrl-S | Save | 执行查询 |
| q | Quit | 退出 |
| y | Copy | 复制查询到剪贴板 |
| d | Delete | 删除查询 |
查询历史
| 默认按键 | 命令 | 描述 |
|---|---|---|
| s | Save | 保存查询 |
| d | Delete | 删除查询 |
| q | Quit | 退出 |
| y | Copy | 复制查询到剪贴板 |
| / | Search | 搜索 |
| Ctrl-_ | ToggleQueryHistory | 切换查询历史模态框 |
| [ | TabPrev | 切换到上一个标签页 |
| ] | TabNext | 切换到下一个标签页 |
JSON Viewer
| 默认按键 | 命令 | 描述 |
|---|---|---|
| Z | ShowRowJSONViewer | 切换 JSON 查看器 |
| z | ShowCellJSONViewer | 切换 JSON 查看器 |
| y | Copy | 复制值到剪贴板 |
| w | ToggleJSONViewerWrap | 切换自动换行 |
External Editor
外部编辑器功能(SQL 编辑器中为 CTRL + Space,表格中为 CTRL + o)使用以下环境变量来确定要使用的编辑器:
- SQL Editor:
$SQL_EDITOR>$EDITOR>$VISUAL>vi - Table cells:
$EDITOR>$VISUAL>vi
此功能仅在 Linux 和 macOS 上可用。
Example connection URLs
postgres://user:pass@localhost/dbname
pg://user:pass@localhost/dbname?sslmode=disable
mysql://user:pass@localhost/dbname
mysql:/var/run/mysqld/mysqld.sock
sqlserver://user:pass@remote-host.com/dbname
mssql://user:pass@remote-host.com/instance/dbname
ms://user:pass@remote-host.com:port/instance/dbname?keepAlive=10
oracle://user:pass@somehost.com/sid
sap://user:pass@localhost/dbname
file:myfile.sqlite3?loc=auto
/path/to/sqlite/file/test.db
odbc+postgres://user:pass@localhost:port/dbname?option1=
路线图
- 支持 NoSQL 数据库
- 通过 TUI 创建列和索引
- 表树输入过滤器
- 自定义键绑定
- 在模态框中显示键绑定
- 重写行
create、update和delete的逻辑
查看 未解决的问题 以获取完整的功能提案列表(以及已知问题)。
(返回顶部)
剪贴板支持
我们使用 atotto/clipboard 来复制到剪贴板。
平台:
- OSX
- Windows 7(可能适用于其他 Windows 版本)
- Linux、Unix(需要安装 'xclip' 或 'xsel' 命令)
贡献
欢迎提交贡献、问题和拉取请求!
(返回顶部)
许可证
依据 MIT 许可证分发。更多信息请参阅 LICENSE.txt。
(返回顶部)
联系方式
Jorge Rojas - LinkedIn - jorgeluisrojasb@gmail.com
(返回顶部)
替代方案
(返回顶部)