讨论一下emacs作为数据库管理客户端的问题

能详细介绍一下吗?

这些本质上不过是裸 SQL 做一个界面包装。org babel 自带 sql 支持,本来和 SQL mode 也没什么差别,但是因为 org mode 自身的强大,使得它丝毫不逊色于一些轻量级的客户端。

简单示例

   #+BEGIN_SRC sql :engine mysql :dbhost 127.0.0.1 :database demo :dbuser user :dbpassword password
     SELECT 1 + 1;
   #+END_SRC

   #+RESULTS:
   | 1 + 1 |
   |-------|
   |     2 |

这是一个简单的示例。表面看和 SQL mode 也没什么区别。但是这是 org mode 啊。src 部分是可以打开一个支持全功能编辑的 buffer 的。虽然没有智能提示,但说实话,用处也不大。本来 SQL 就很简单。下面的输出结果虽然改了也不起作用,但是 org mode 的所有表格操作都能应用。不要嫌 #+BEGIN_SRC 太长,<s 加个 tab 就出来了。中文对齐也完全没问题,感谢 @tumashu

连接管理

如果每次都要写一次连接就太弱鸡了。可以这样

* this is a connection
  :PROPERTIES:
  :header-args:sql: :engine mysql :dbhost 127.0.0.1 :database demo :dbuser user :dbpassword password
  :END:
   #+BEGIN_SRC sql
     SELECT 1 + 1;
   #+END_SRC

设置对这个 headline 包括子 headline 全部有效,想怎么折叠怎么折叠,一定程度算是 org mode 的界面。

定制化加持

加上这个功能之后,我觉得真正独一无二了。

比如 ebdi 查看表结构。

加一个变量

  #+name: cols
  #+BEGIN_SRC sql
   SHOW FULL columns FROM $t;
  #+END_SRC

调用

#+call: cols(t="this-is-table-name")

改表结构什么的就不是事

22 个赞

楼主说的是类似常见 GUI 客户端一样,直接在查询结果中直接修改数据、修改表结构,而不是用 SQL 代码来修改。所以 org-mode 不符合这个要求,你不能通过修改 +RESULTS: 中的内容来改变数据库。

org-mode 用来组织测试用例还是不错的,不需要双向互动。

1 个赞

:dbpassword 那里,密码要加双引号,不然会报以下错误: org-babel-execute:sql: Wrong type argument: sequencep, 123456 这里 123456 是我的密码. 要用 :dbpassword “123456” 就没问题了,我猜是因为密码中可能会包含特殊字符.

我现在也用org babel,直接当notebook用。但也有些问题… 比如result是用org table渲染的,不支持column value里有换行或reserved symbols(如 “|”),不然整个result就乱了。

用org babel sql来改数据库结构定义这些应该不太好整,可以退一步,emacs org不做改数据库结构定义这些事, 只需要增删改查数据库里的数据就行。

我觉得数据库结构定义这些要慎重,确定下来就不要轻易改动,因为实际开发中情况往往是数据库一个小改动,到了后端,前端就是大改,特别是前端…(为了“兼容”后端可能返回的各种未知数据,不得不增加工作量)

emacs org不用管数据库结构,只管数据的增删改查,做成几个按钮可以点击(运行elisp)的形式,这样org-mode即是数据库管理工具的同时也可以是一个应用的前端 :joy:

以前我也考虑过 org 只管数据的增删改查,但是这样的话那还不如 mysqlcli之类的工具好用

我理解数据增删改查指在完全不写sql语句的情况下通过可视化界面(不是图形化界面)实现。

我基本不在命令行下操作数据库,用的是adminer.php(自已编译的版本),用久了发现数据结构固定下来就很少改了,在adminer里大部分操作都是增删改查,其中查(搜索)在org-mode里进行可能不是最好的选择,但是属于文本编辑的直接在org-mode里面进行在好不过了

将org作为文本编辑界面很常用,但将org作为数据查询的结果页面展示我估计很少有人怎么做吧。

下图是我将org作用数据查询结果的操作和结果页面

图片

图片

在org mode里修改数据的意思是,通过查询语句返回对应的行,然后可视化修改对应行的数据吗

我是写了一个服务端,org文件在操作时(点击按钮)把内容发送到服务端,服务端根据org文件的内容生成sql语句执行,然后返回包含执行结果在内的完整的org文本到emacs

org中的操作代码差不多都类似这样: [[elisp:(progn (erase-buffer)(url-insert-file-contents "http://[::1]/org.php?from=home&a=del&title=org文件加载时自动展开折叠效果测试")(save-buffer)(next-line 2)(org-end-of-line))][删除(不可恢复)]]

还有很多问题没有解决,目前想不用url-insert-file-contents了,因为会卡住emacs。

这里有个技巧,就是可以在服务器端返回结果中充分利用org-mode中文学编程的能力,比如服务器端生成的sql语句没有得到预期结果,需要将sql语句输出查看时可以这么写:

echo "#+BEGIN_SRC sql\n".$sql."#+END_SRC";

这样在org文件中就是以文学编程的形式查看sql语句。并使用undo返回上一页面继续上一步的操作,emacs的undo在这里就相当于浏览器的后退键(但是更加灵活)

1 个赞

用org写复杂的sql query非常好用,配合noweb不要太爽。

如何实现sql自动提示呢?

可以选sql-language-server或是sqls。

sqls在lsp-mode中已集成。但是vscode插件的下载量很低。

所以我选了第一个,但是有错误,只要一补全就出错,加日志,跟踪执行,发现jsonrpc没有出错,出错的是console.time。tryReaderHeaders不能识别附加的调试信息,改变一下正则表达式就行了。

补全不了列名,连node里试验pg都没有结果,整了半天,删除里面的pg库,用全局的pg库总算是弄出来了。

sudo是怎么解决的?

在发现 vim 有 dadbod 后,发现 sqls 也蛮好用。晚上回来自己做了一个 brew tap,配置完之后开一个 sql-mysql 和一个 sql-mode 的 buffer 之后,补全体验也有了。也可以和 python-mode 一样 C-c C-c 执行,体验也蛮好的,可能只差一个 treemacs 一样的显示各个列名的东西,就和我平常用到的 navicat 感觉差不多了

如果熟悉 Ruby 和 ActiveRecord 可以试试这个: lululau/arql: Rails ActiveRecord is the best SQL query editor (github.com)

有 gif 康康什么样子吗,我 eglot 配置 sqls 可以连上去但是补全好像没用

img

1 个赞