DataGrip生成Table Docment文档脚本

Groovy脚本

import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil
import com.intellij.database.psi.DbColumn;



FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->

    def schemaMap = new LinkedHashMap<String,Map<String,String>>();
    SELECTION.filter { (it.getKind() == ObjectKind.TABLE || it.getKind() == ObjectKind.SCHEMA) }.each {
        def schemaName = DasUtil.getSchema(it);
        if(!schemaMap.containsKey(schemaName)){
            schemaMap.put(schemaName,new LinkedHashMap<String,String>());
        }
        LOG.print("SELECTION type:"+it.getKind());
        if(it.getKind() == ObjectKind.TABLE){
            def tableName = it.getName();
            if(!schemaMap.get(schemaName).containsKey(tableName)){
                schemaMap.get(schemaName).put(tableName,generateTableHTMLStyle(it));
            }
        }else if(it.getKind() == ObjectKind.SCHEMA){
            LOG.print("DasChildren:"+it.getDasChildren(ObjectKind.TABLE));
            it.getDasChildren(ObjectKind.TABLE).each { table ->
                def tableName = table.getName();
                if(!schemaMap.get(schemaName).containsKey(tableName)){
                    schemaMap.get(schemaName).put(tableName,generateTableHTMLStyle(table));
                }
            }
        }
    }
    def outlineHtml = '';
    def tableHtml = '';
    LOG.print("schemaMap:"+schemaMap);
    schemaMap.each { schema ->

        outlineHtml += '<div id="_ul">';
        outlineHtml += '<a href="#'+schema.key+'">'+schema.key+'</a>';

        outlineHtml += '    <div id="_ul">';
        tableHtml += '<h2 id="'+schema.key+'"><a class="anchor" name="'+schema.key+'" href="#'+schema.key+'"><span class="octicon octicon-link"></span></a>'+schema.key+'</h2>';
        schema.value.each { t ->
            outlineHtml += '<a href="#'+(schema.key+'.'+t.key)+'">'+(schema.key+'.'+t.key)+'</a>';
            tableHtml += (t.value);
        }
        outlineHtml += '    </div>';

        outlineHtml += '</div>';
    };

    def styleCss = '@font-face{font-family: octicons-link; src: url(data:font/woff;charset=utf-8;base64,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) format(\'woff\');} .markdown-body{-ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; line-height: 1.5; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px; line-height: 1.5; word-wrap: break-word;} .markdown-body .pl-c{color: #6a737d;} .markdown-body .pl-c1, .markdown-body .pl-s .pl-v{color: #005cc5;} .markdown-body .pl-e, .markdown-body .pl-en{color: #6f42c1;} .markdown-body .pl-smi, .markdown-body .pl-s .pl-s1{color: #24292e;} .markdown-body .pl-ent{color: #22863a;} .markdown-body .pl-k{color: #d73a49;} .markdown-body .pl-s, .markdown-body .pl-pds, .markdown-body .pl-s .pl-pse .pl-s1, .markdown-body .pl-sr, .markdown-body .pl-sr .pl-cce, .markdown-body .pl-sr .pl-sre, .markdown-body .pl-sr .pl-sra{color: #032f62;} .markdown-body .pl-v, .markdown-body .pl-smw{color: #e36209;} .markdown-body .pl-bu{color: #b31d28;} .markdown-body .pl-ii{color: #fafbfc; background-color: #b31d28;} .markdown-body .pl-c2{color: #fafbfc; background-color: #d73a49;} .markdown-body .pl-c2::before{content: "^M";} .markdown-body .pl-sr .pl-cce{font-weight: bold; color: #22863a;} .markdown-body .pl-ml{color: #735c0f;} .markdown-body .pl-mh, .markdown-body .pl-mh .pl-en, .markdown-body .pl-ms{font-weight: bold; color: #005cc5;} .markdown-body .pl-mi{font-style: italic; color: #24292e;} .markdown-body .pl-mb{font-weight: bold; color: #24292e;} .markdown-body .pl-md{color: #b31d28; background-color: #ffeef0;} .markdown-body .pl-mi1{color: #22863a; background-color: #f0fff4;} .markdown-body .pl-mc{color: #e36209; background-color: #ffebda;} .markdown-body .pl-mi2{color: #f6f8fa; background-color: #005cc5;} .markdown-body .pl-mdr{font-weight: bold; color: #6f42c1;} .markdown-body .pl-ba{color: #586069;} .markdown-body .pl-sg{color: #959da5;} .markdown-body .pl-corl{text-decoration: underline; color: #032f62;} .markdown-body .octicon{display: inline-block; vertical-align: text-top; fill: currentColor;} .markdown-body a{background-color: transparent; -webkit-text-decoration-skip: objects;} .markdown-body a:active, .markdown-body a:hover{outline-width: 0;} .markdown-body strong{font-weight: inherit;} .markdown-body strong{font-weight: bolder;} .markdown-body h1{font-size: 2em; margin: 0.67em 0;} .markdown-body img{border-style: none;} .markdown-body svg:not(:root){overflow: hidden;} .markdown-body code, .markdown-body kbd, .markdown-body pre{font-family: monospace, monospace; font-size: 1em;} .markdown-body hr{box-sizing: content-box; height: 0; overflow: visible;} .markdown-body input{font: inherit; margin: 0;} .markdown-body input{overflow: visible;} .markdown-body [type="checkbox"]{box-sizing: border-box; padding: 0;} .markdown-body *{box-sizing: border-box;} .markdown-body input{font-family: inherit; font-size: inherit; line-height: inherit;} .markdown-body a{color: #0366d6; text-decoration: none;} .markdown-body a:hover{text-decoration: underline;} .markdown-body strong{font-weight: 600;} .markdown-body hr{height: 0; margin: 15px 0; overflow: hidden; background: transparent; border: 0; border-bottom: 1px solid #dfe2e5;} .markdown-body hr::before{display: table; content: "";} .markdown-body hr::after{display: table; clear: both; content: "";} .markdown-body table{border-spacing: 0; border-collapse: collapse;} .markdown-body td, .markdown-body th{padding: 0;} .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6{margin-top: 0; margin-bottom: 0;} .markdown-body h1{font-size: 32px; font-weight: 600;} .markdown-body h2{font-size: 24px; font-weight: 600;} .markdown-body h3{font-size: 20px; font-weight: 600;} .markdown-body h4{font-size: 16px; font-weight: 600;} .markdown-body h5{font-size: 14px; font-weight: 600;} .markdown-body h6{font-size: 12px; font-weight: 600;} .markdown-body p{margin-top: 0; margin-bottom: 10px;} .markdown-body blockquote{margin: 0;} .markdown-body ul, .markdown-body ol{padding-left: 0; margin-top: 0; margin-bottom: 0;} .markdown-body ol ol, .markdown-body ul ol{list-style-type: lower-roman;} .markdown-body ul ul ol, .markdown-body ul ol ol, .markdown-body ol ul ol, .markdown-body ol ol ol{list-style-type: lower-alpha;} .markdown-body dd{margin-left: 0;} .markdown-body code{font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px;} .markdown-body pre{margin-top: 0; margin-bottom: 0; font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12px;} .markdown-body .octicon{vertical-align: text-bottom;} .markdown-body .pl-0{padding-left: 0 !important;} .markdown-body .pl-1{padding-left: 4px !important;} .markdown-body .pl-2{padding-left: 8px !important;} .markdown-body .pl-3{padding-left: 16px !important;} .markdown-body .pl-4{padding-left: 24px !important;} .markdown-body .pl-5{padding-left: 32px !important;} .markdown-body .pl-6{padding-left: 40px !important;} .markdown-body::before{display: table; content: "";} .markdown-body::after{display: table; clear: both; content: "";} .markdown-body>*:first-child{margin-top: 0 !important;} .markdown-body>*:last-child{margin-bottom: 0 !important;} .markdown-body a:not([href]){color: inherit; text-decoration: none;} .markdown-body .anchor{float: left; padding-right: 4px; margin-left: -20px; line-height: 1;} .markdown-body .anchor:focus{outline: none;} .markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre{margin-top: 0; margin-bottom: 16px;} .markdown-body hr{height: 0.25em; padding: 0; margin: 24px 0; background-color: #e1e4e8; border: 0;} .markdown-body blockquote{padding: 0 1em; color: #6a737d; border-left: 0.25em solid #dfe2e5;} .markdown-body blockquote>:first-child{margin-top: 0;} .markdown-body blockquote>:last-child{margin-bottom: 0;} .markdown-body kbd{display: inline-block; padding: 3px 5px; font-size: 11px; line-height: 10px; color: #444d56; vertical-align: middle; background-color: #fafbfc; border: solid 1px #c6cbd1; border-bottom-color: #959da5; border-radius: 3px; box-shadow: inset 0 -1px 0 #959da5;} .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6{margin-top: 24px; margin-bottom: 16px; font-weight: 600; line-height: 1.25;} .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link{color: #1b1f23; vertical-align: middle; visibility: hidden;} .markdown-body h1:hover .anchor, .markdown-body h2:hover .anchor, .markdown-body h3:hover .anchor, .markdown-body h4:hover .anchor, .markdown-body h5:hover .anchor, .markdown-body h6:hover .anchor{text-decoration: none;} .markdown-body h1:hover .anchor .octicon-link, .markdown-body h2:hover .anchor .octicon-link, .markdown-body h3:hover .anchor .octicon-link, .markdown-body h4:hover .anchor .octicon-link, .markdown-body h5:hover .anchor .octicon-link, .markdown-body h6:hover .anchor .octicon-link{visibility: visible;} .markdown-body h1{padding-bottom: 0.3em; font-size: 2em; border-bottom: 1px solid #eaecef;} .markdown-body h2{padding-bottom: 0.3em; font-size: 1.5em; border-bottom: 1px solid #eaecef;} .markdown-body h3{font-size: 1.25em;} .markdown-body h4{font-size: 1em;} .markdown-body h5{font-size: 0.875em;} .markdown-body h6{font-size: 0.85em; color: #6a737d;} .markdown-body ul, .markdown-body ol{padding-left: 2em;} .markdown-body ul ul, .markdown-body ul ol, .markdown-body ol ol, .markdown-body ol ul{margin-top: 0; margin-bottom: 0;} .markdown-body li>p{margin-top: 16px;} .markdown-body li+li{margin-top: 0.25em;} .markdown-body dl{padding: 0;} .markdown-body dl dt{padding: 0; margin-top: 16px; font-size: 1em; font-style: italic; font-weight: 600;} .markdown-body dl dd{padding: 0 16px; margin-bottom: 16px;} .markdown-body table{display: block; width: 100%; overflow: auto;} .markdown-body table th{font-weight: 600; background-color: #f6f8fa;} .markdown-body table th, .markdown-body table td{padding: 6px 13px; border: 1px solid #dfe2e5;} .markdown-body table tr{background-color: #fff; border-top: 1px solid #c6cbd1;} .markdown-body table tr:nth-child(2n){background-color: #f6f8fa;} .markdown-body img{max-width: 100%; box-sizing: content-box; background-color: #fff;} .markdown-body img[align=right]{padding-left: 20px;} .markdown-body img[align=left]{padding-right: 20px;} .markdown-body code{padding: 0; padding-top: 0.2em; padding-bottom: 0.2em; margin: 0; font-size: 85%; background-color: rgba(27,31,35,0.05); border-radius: 3px;} .markdown-body code::before, .markdown-body code::after{letter-spacing: -0.2em; content: "\\00a0";} .markdown-body pre{word-wrap: normal;} .markdown-body pre>code{padding: 0; margin: 0; font-size: 100%; word-break: normal; white-space: pre; background: transparent; border: 0;} .markdown-body .highlight{margin-bottom: 16px;} .markdown-body .highlight pre{margin-bottom: 0; word-break: normal;} .markdown-body .highlight pre, .markdown-body pre{padding: 16px; overflow: auto; font-size: 85%; line-height: 1.45; background-color: #f6f8fa; border-radius: 3px;} .markdown-body pre code{display: inline; max-width: auto; padding: 0; margin: 0; overflow: visible; line-height: inherit; word-wrap: normal; background-color: transparent; border: 0;} .markdown-body pre code::before, .markdown-body pre code::after{content: normal;} .markdown-body .full-commit .btn-outline:not(:disabled):hover{color: #005cc5; border-color: #005cc5;} .markdown-body kbd{display: inline-block; padding: 3px 5px; font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; line-height: 10px; color: #444d56; vertical-align: middle; background-color: #fafbfc; border: solid 1px #d1d5da; border-bottom-color: #c6cbd1; border-radius: 3px; box-shadow: inset 0 -1px 0 #c6cbd1;} .markdown-body :checked+.radio-label{position: relative; z-index: 1; border-color: #0366d6;} .markdown-body .task-list-item{list-style-type: none;} .markdown-body .task-list-item+.task-list-item{margin-top: 3px;} .markdown-body .task-list-item input{margin: 0 0.2em 0.25em -1.6em; vertical-align: middle;} .markdown-body hr{border-bottom-color: #eee;} /*Markdown Viewer*/ .markdown-body summary:hover{cursor: pointer;} .markdown-body ul li p{margin: 0;} #_toc{position: fixed; top: 0px; bottom: 0px; left: 0px; width: 300px; height: 100%; overflow-y: auto; overflow-x: hidden; background: rgb(250, 250, 250);} #_toc #_ul{padding: 0px 0px 0px 20px !important; margin: 0px !important;} #_toc #_ul a{font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 17px; color: rgb(54, 65, 73); font-weight: normal; font-style: normal; text-transform: none; letter-spacing: 0.2px; display: block; text-decoration: none; background: none !important; border-width: 0px !important; border-style: initial !important; border-color: initial !important; border-image: initial !important; padding: 10px 15px !important;} #_toc #_ul a:hover{text-decoration: underline;} .markdown-body{background-color: rgb(255, 255, 255); overflow: auto; border-width: 1px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; padding: 45px; margin: 20px auto; position: fixed; left: 300px; right: 0; bottom: 0; top: 0;} tbody tr td:first-child,td:nth-child(3),td:nth-child(5),td:nth-child(6) {text-align: center;font-weight: bold;}';

    
    def head = '<head><style>'+styleCss+'</style></head>';

    def docBody = '<div id="_html" class="markdown-body">'+tableHtml+'</div>';

    def outlineBody = '<div id="_toc">'+outlineHtml+'</div>';

    def body = '<body class="_toc-left">'+docBody + outlineBody +'</body>';

    def doc = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n<html>'+head+body+'</html>';

    new File(dir, "test.html").withPrintWriter { out -> out.println doc }
}

def generateTableHTMLStyle(table){
    def schema = DasUtil.getSchema(table);
    def tableName = table.getName();
    def tableComment = table.getComment();
    def tr = '';
    DasUtil.getColumns(table).reduce([]) { fields, col ->
        def columnComment = (col.getComment() == null ? '' : col.getComment());
        def columnName = col.getName();
        def columnType = col.getDataType().getSpecification();
        def isNotNullHtml = (col.isNotNull() ? '<font color="red">是</font>' : '<font color="blue">否</font>');
        def defaultVal = (col.getDefault() == null ? '' : col.getDefault());
        def isPrimaryHtml = (DasUtil.isPrimary(col) ? '<font color="red">是</font>' : '<font color="blue">否</font>');
        def expandHtml = '<ul>' +
                (DasUtil.isAutoGenerated(col) ? '<li>自增</li>' : '') +
                (DasUtil.isForeign(col) ? '<li>外键</li>' : '') +
                (col.getDataType().getSpecification().indexOf("unsigned") != -1 ? '<li>无符号</li>' : '') +
                (col.getDataType().getSpecification().indexOf("zerofill") != -1 ? '<li>零填充</li>' : '') +
                '</ul>';
        tr += '<tr><td>'+columnName+'</td><td>'+columnType+'</td><td>'+isNotNullHtml+'</td><td>'+defaultVal+'</td><td>'+isPrimaryHtml+'</td><td>'+expandHtml+'</td><td>'+columnComment+'</td></tr>';
    }
    def thead = '<thead><tr><th width="8%">字段名</th><th width="15%">类型</th><th width="1%">允许NULL</th><th width="15%">默认值</th><th width="4%">主键</th><th width="8%">扩展信息</th><th width="100%">说明</th></tr></thead>';
    def tbody = '<tbody>'+tr+'</tbody>';
    def tableHtml = '<table><caption><a href="#_top" name="'+(schema+'.'+tableName)+'"><h2>'+(tableComment == null ? '' : tableComment)+'('+(schema+'.'+tableName)+')</h2></a></caption>'+thead+tbody+'</table>';
    return tableHtml;
}

顶部飞机

效果图

在这里插入图片描述
顶部飞机

食用方法

简明Tips

1.直接将上文Groovy脚本保存后缀为groovy的文件
2.复制到 C:\Users\<用户名>\<DataGrip版本>\config\extensions\com.intellij.database\schema目录下
3.随便选择一个数据库
4.右键找到Scripted Extensions
5.你复制进去的groovy文件,选择目录
6.在目录下找到 test.html 打开 -> 完成

顶部飞机

详细操作
  1. 右键选择schemas -> Scripted Extensions -> Go to Script Directory

在这里插入图片描述

  1. 找到Files窗口 -> Show in Explorer
    在这里插入图片描述
  2. 找到弹出的窗口
    在这里插入图片描述
  3. 新建一个后缀为groovy的文件,将上文 Groovy脚本 复制进去,剩余步骤参考 简明Tips 3-6

顶部飞机

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值