clutch —— Emacs 数据库客户端(MySQL/PostgreSQL/SQLite/Oracle/SQL Server 等)

项目地址:


写了个 Emacs 数据库客户端,用了一段时间了,分享出来。

MySQL 和 PostgreSQL 是纯 Elisp 实现的,直接走 wire protocol,不需要装 mysql CLI 或者 libpq。SQLite 用的是 Emacs 29+ 内置的 sqlite 支持。Oracle、SQL Server、DB2、Snowflake、Redshift 这些走 JDBC,通过一个小 JVM sidecar(clutch-jdbc-agent)来跑,Emacs 和它之间用 stdin/stdout JSON 通信,第一次用的时候会自动下载。

主要功能:

  • 结果表格可以横向翻列([ / ]),不用横向滚动
  • 表格里直接改单元格,自动生成 UPDATE,确认后提交;也可以插行(o)删行(d
  • 有外键的话可以直接跳到关联表的对应行
  • Schema 浏览器,TAB 展开列详情
  • 补全会根据当前语句的 FROM 子句来,只补当前查询里用到的表和列
  • Eldoc 支持:悬停在表名/列名上会显示类型、是否可空、PK/FK 信息;MySQL 还会查在线 HELP
  • 值查看器(v):JSON 直接美化,XML 格式化,BLOB 十六进制预览
  • Org-Babel 集成,可以在 Org 文件里跑 SQL

暂时没上 MELPA,从源码加载:

(add-to-list 'load-path "/path/to/clutch")
(require 'clutch)

(setq clutch-connection-alist
      '(("dev-mysql"   . (:backend mysql
                           :host "127.0.0.1" :port 3306
                           :user "root" :password "secret"
                           :database "mydb"))
        ("dev-pg"      . (:backend pg
                           :host "127.0.0.1" :port 5432
                           :user "postgres" :password "secret"
                           :database "mydb"))
        ("dev-sqlite"  . (:backend sqlite
                           :database "/path/to/my.db"))
        ;; Oracle 需要 Java 11+ 和 ojdbc jar 放到 drivers/ 下
        ("prod-oracle" . (:backend oracle
                           :url "jdbc:oracle:thin:@//host:1521/ORCL"
                           :user "scott" :password "tiger"))))

M-x clutch-query-console 选连接就可以用了。

17 个赞

之前是纯 elisp,但是我工作中也用到 oracle,所以加了 clutch-db-jdbc (默认不加载),就可以通过 jdbc driver 拿数据了。

太棒了,刚试用了一下,完成度很高,之前很想要个类似的工具,终于找到了,感谢。一个建议:增加一个连接的超时时间配置选项

感谢反馈,已经加上了。现在不仅支持自定义连接超时,我也把整套超时配置顺手统一了一下,避免不同后端里同一个参数含义不一致。现在可以分别控制连接超时、读空闲超时、查询超时,以及 JDBC 的 RPC 超时,也支持按具体连接单独配置。

当时开发这个就是因为想要替换掉 DataGrip,尽量覆盖自己平时用到的功能。

4 个赞

("dev-mysql"
  :backend mysql
  :host "127.0.0.1" :port 3306
  :user "root" :password "secret"
  :database "mydb")

这两个应该等价的吧,后面可能更简洁

是可以的,前面那个写起来更清晰一点,key value。

不错啊,本地的sqlite可用,可惜我们的mysql是不允许直连的,没法用。

是登录云电脑然后链接查询?

有单独的平台可以访问数据库等数据类资源,有操作记录、权限审批等功能。直连是绝对不允许的,也有防火墙限制。

那感觉和我们以前先登录云电脑(所有操作均有记录),然后链接Oracle数据库查询类似。查询现网日志也是一样的操作。

连接oracle失败,错误消息condition-case: Connection failed: Database error: "Connection failed (oracle): Database error: \"ORA-01005: null password given; logon denied \"" 下面是我的配置,我用的是oracle 19, 我尝试了替换ojdbc11.jar 为ojdbc8.jar,问题还是一样

(add-to-list 'load-path "/path/to/clutch/")
(require 'clutch)
(add-to-list 'auto-mode-alist '("\\.sql\\'" . clutch-mode))

(setq clutch-connect-timeout-seconds 10
      clutch-read-idle-timeout-seconds 30
      clutch-query-timeout-seconds 20
      clutch-jdbc-rpc-timeout-seconds 15)

(require 'clutch-db-jdbc)

;; Download clutch-jdbc-agent.jar (once):
(clutch-jdbc-ensure-agent)

;; Optional: allow a locally built jar with checksum verification disabled.
;; Keep this nil only if you intentionally manage the jar yourself.
(setq clutch-jdbc-agent-sha256 nil)

;; Install a JDBC driver (Oracle, SQL Server, Snowflake, Redshift):
(clutch-jdbc-install-driver 'oracle)      ; ojdbc11.jar from Maven Central
(setq clutch-connection-alist
      '(;; Oracle (SID style — use :sid instead of :database)
        ("prod-oracle-sid" . (:backend oracle
                               :host "192.168.100.10" :port 1521
                               :sid "chn"
                               :user "xxxx" :pass-entry "yyyy"))

        ))

好久没看见oracle了,我们已经去IOE好多年了。

pass 中有对应的条目么?或者你直接写 :password "真密码" 试试?

换成password 工作了,谢谢!我要好好玩一段时间,以前用ejc-sql 这个包,连接数据库不容易连上,你这个包好像很快。

谢谢,有问题就提,我也是因为还有 oracle 的需求,才用 java 弄了一层。不过不用的人也可以不加载 clutch-db-jdbc.el

你用oracle 时有表名和列名的完成提示吗?我这里不工作样.

修复了,需要更新clutch,重新拉去最新的 jar 包。

1 个赞

oracle 获取全部的schema比较慢,因此分为了两步,先会去表和列信息方便补全,然后再异步获取全部schema信息,这样就不会拖慢连接了。