在emacs中获得sql的自动补全

背景

工作中需要写大量的sql语句,
datagrip 免费版需要注册账户才能使用,比较麻烦,也不再有重复性.
其他的DB工具异常难用,无论是键位设置还是自动补全功能都十分孱弱.
偶然得知emacs中sql拥有了lsp的支持.因此尝试.

配置

lsp的后端是以go书写的.相对来说比node,gem等方面许多.

1
go install github.com/lighttiger2505/sqls@latest

如果要保持最新,还是以yay安装更合适一些
emacs中需要配置

1
2
3
4
5
6
(sql :variables
sql-backend 'lsp
sql-lsp-sqls-workspace-config-path 'root
sql-capitalize-keywords t
sql-capitalize-keywords-blacklist '("name" "user")
sql-auto-indent t)

此外还需要准备一个连接用的配置文件

1
2
3
4
5
6
7
8
9
10
{
"sqls": {
"connections": [
{
"driver": "mysql",
"dataSourceName": "user:passwd@tcp(localhost:3306)/sample_db"
}
]
}
}

官方只说文件需要保存为 .sqls/config.json.
至于整个结构放在哪里,完全没有说清楚.(主要受到微软那垃圾的workspace概念影响)

连接配置放在项目内

最终发现
sql-lsp-sqls-workspace-config-path 的两种配置

  • workspace 放在sql文件的同级文件夹下

    1
    2
    3
    4
    5
    6
    7
    .
    ├── sqls
    │ ├── 1.sql
    │ ├── 2.sql
    │ └── .sqls
    │ └── config.json
    └── others
  • root 放在项目根目录下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    .
    ├── .sqls
    │ └── config.json
    ├── somesql
    │ ├── 1.sql
    │ └── 2.sql
    └── othersql
    ├── 1.sql
    └── 2.sql

连接配置放在项目外

根据官方的说法,可以在 $HOME/.config/sqls/config.yml 下以yaml的方式书写配置,
比如

1
2
3
4
5
lowercaseKeywords: false
connections:
- alias: xxx
driver: mysql
dataSourceName: root:root@tcp(lcoalhost:3306)/world

可能需要手动配置 $XDG_CONFIG_HOME 变量为 $HOME/.config
目前linux上支持如此使用.
mac环境下,虽然能看到确实读取了该文件(故意让文件语法有错),
但报了lsp相关的错误(不理解 cancelRequest),无法使用(mac终于是将四不像发展到了极致).

效果

  • 表名,字段名的自动补全
  • 命令的自动补全
  • 关键词的自动大写

但依然不够好,相比datagrip缺失许多功能

  • join自动补全
  • 书写insert语句时的字段匹配高亮

遗留问题

  • 文件很大时sqls会卡住,emacs又是单线程,只是单纯等待,也会卡.
    所以在编辑大文件,比如超过1000行时,注意先切换到其他模式.
  • 字段名的自动补全不考虑当前光标所在行
    会同时提示该文件中提到的所有表的字段

参考

  1. sql layer
  2. lsp后端支持