Sequel Pro 实现更好的 SQL 格式化

作者: Newt0n | 来源:发表于2017-04-21 15:55 被阅读368次

    原文:Sequel Pro 实现更好的 SQL 格式化

    说起 Mac 上的数据库管理 App,靠谱的可选项并不多,除了 Win 平台同样有的老牌全功能客户端 Navicat,仅有 Sequel Pro、SQLPro Studio 等几个轻量的选择以及官方的 Workbench 和发布不久的 DataGrip。

    在工具的选择上一向偏爱简洁够用就好,最初用 Mac 时反复比较了多个可选项最终选择了开源的 Sequel Pro 作为首选客户端,和之前在 Win 上主要用的 SQLyog 相比,界面操作之类的都可以习惯,唯独 SQL 格式化功能始终不能忍受。

    自带格式化功能入口

    Sequel Pro 的 SQL 格式化功能以 Bundle 也就是插件的形式提供,使用菜单 Bundles->Input Field->Format->Format SQL 执行。

    image.png

    修正自带 Bundle

    官方版本自带的 Bundle 很可能无法开箱即用:

    image.png

    可以根据这个 Issue (https://github.com/sequelpro/sequelpro/issues/1988#issuecomment-60658598) 下的评论修正:

    • 打开菜单 Bundles -> Bundle Editor
    • 左边栏选择 Input field (Show) -> Format (Show) -> Format SQL (Show)
    • 在 "Command" 区域找到这行代码 <input type="hidden" name="clientid" value="..." />
    • 把这个 inputvalue 改为 dpriver-9094-8133-2031
    • 保存

    这样修改后 SQL 格式化应该可以正常工作。

    可以发现 Sequel Pro 提供的 SQL 格式化功能是以调用远程接口服务来实现的,并不是客户端内置的原生功能,使用时也需要联网。

    自己动手

    自带的 Bundle 修正之后基本功能没问题,但执行的时候不仅会弹出个调用远程接口的对话框,而且 SQL 的格式也不太令人满意。

    除了 Sequel Pro 提供的 Bundle 所使用的 SQL格式化的服务外,还有其他类似的服务同样提供了可随意调用的 API,比如 https://sqlformat.org/

    这里就以 https://sqlformat.org/ 为例介绍一下如何创建一个比官方更好用的自定义 SQL 格式化 Bundle。

    打开 Bundle 编辑器

    按菜单 Bundles -> Bundle Editor 打开编辑器

    image.png

    创建 Bundle

    将侧边菜单展开到 Input Field -> Format -> Format SQL,右键创建一个副本。

    image.png

    配置 Bundle

    image.png

    注意将 OutPut 项更改为 Replace Selection,然后在 Command 部分贴入以下代码:

    #!/usr/bin/python
    #coding=utf-8
    import urllib2, urllib
    import json
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    sql = sys.stdin.read()
    params = {'sql': sql, 'reindent': 1, 'keyword_case': 'upper', 'identifier_case': 'lower'}
    response = urllib2.urlopen('https://sqlformat.org/api/v1/format', data=urllib.urlencode(params))
    data = json.loads(response.read())
    print data['result']
    

    代码的功能就是调用了 https://sqlformat.org/ 的 API 并用格式化后的结果替换掉所选择的 SQL,代码贴完后 Save,从菜单里启用或者设置个快捷键看看效果吧。

    这样一条 SQL:

    SELECT TYPE, sum(CASE vender WHEN 'A' THEN pcs ELSE 0 END), sum(CASE vender WHEN 'C' THEN pcs ELSE 0 END), sum(CASE vender WHEN 'B' THEN pcs ELSE 0 END) FROM tablename t LEFT JOIN t1 ON t1.id = t.id LEFT JOIN t2 ON t2.id = t.id GROUP BY `type` ORDER BY t.create_time DESC HAVING t.cnt > 2
    

    格式化之后:

    image.png

    sqlformat.org 的 API 文档里还有一些可选项可以设置,比如是否大写关键字、缩进宽度、是否移除注释等,可以参考文档修改代码参数。

    附 PHP 版代码,效果一致:

    #!/usr/bin/php
    <?php
    $sql = @file_get_contents("php://stdin");
    
    $req = [
        'reindent' => 1,
        'sql' => $sql,
        'keyword_case' => 'upper',
        'identifier_case' => 'lower',
    ];
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://sqlformat.org/api/v1/format');
    curl_setopt($ch, CURLOPT_POST, count($req));
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($req));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $ret = curl_exec($ch);
    curl_close($ch);
    
    echo json_decode($ret, true)['result'];
    

    懒得折腾,下载打包好的 Bundle 直接导入即可:

    http://newt0n.github.io/2017/04/14/Sequel-Pro-SQL-Formatter/Format-SQL-Py.spBundle.zip

    参考

    关注 NewtonIO - 创造者们的技术与工具

    Wechat

    相关文章

      网友评论

      • 5d934b5462d4:发现了个新的方法,懒得自己写就来这里推荐一下了,望谅解!
        1. git clone https://github.com/andialbrecht/sqlparse.git
        2. 切到项目目录 sudo python setup.py install 有坑踩坑。。这里尽量使用python2,python3 在后边读取参数的时候会有坑,不是这方面大侠,就饶了下,没有去解决
        3. 切换到sequel 软件 bundles->Input Field(show)->Format(show)->command + D 复制一条bundle
        4. bundle scope 选 input Field , menu Label 写个format啥的(这个会显示在Bundles->Input Field的相关目录下),Menu Category 填 Format,快捷键自己定义好了,这里有个坑就是如果你设置F9一类的组合快捷键会把F9按键替换为对应的数字按键,不知道是不是都会发生自己看着踩吧, Input 填 Selected Text OR 选 Current Query output 填 Replace Selection
        5. 下边是相关代码
        #!/usr/bin/python
        #coding=utf-8
        import sys
        import sqlparse;
        reload(sys)
        sys.setdefaultencoding('utf-8')
        sql = sys.stdin.read()
        print sqlparse.format(sql,reindent = True);
        6. 以上很多地方都可以只有填写,能看懂的就自己参考着自己来吧,看不懂的按部就班好了

        -- 懒人 --

      本文标题:Sequel Pro 实现更好的 SQL 格式化

      本文链接:https://www.haomeiwen.com/subject/bjbdzttx.html