能详细介绍一下吗?
这些本质上不过是裸 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")
改表结构什么的就不是事
楼主说的是类似常见 GUI 客户端一样,直接在查询结果中直接修改数据、修改表结构,而不是用 SQL 代码来修改。所以 org-mode 不符合这个要求,你不能通过修改 +RESULTS:
中的内容来改变数据库。
org-mode 用来组织测试用例还是不错的,不需要双向互动。
: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即是数据库管理工具的同时也可以是一个应用的前端
以前我也考虑过 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在这里就相当于浏览器的后退键(但是更加灵活)
用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 可以连上去但是补全好像没用