先看效果

DataGrip中使用Groovy脚本

引言

最近在使用JetBrain家的数据库管理软件Data Grip中发现了一个比较好玩的功能点: 数据提取工具(Data Extractors )。 该工具自带了几种提取方式,如下图所示,并且支持用户使用groovy脚本去自定义。

image-20220626110934800

虽然自带的这几个数据提取工具已经很好用了,但是我在使用中还是遇到了一些场景无法满足我的需求。
比如我在分组时,想验证下分组的数据对不对,就要根据分组的条件去查下数据。 一般我们都会手动输入,如果分组条件就一两个还好,多了的话就比较烦了。所以我就想到了自己去写一个自定义的数据提取器。

正文

1. 前往脚本目录

点击当前的数据提取器,然后选择Go To Scripts Directory

image-20220626114116458

2. 新建数据提取器

右击exactors -> New -> File , 输入文件名称.groovy。这里由于我的是基于groovy实现的,所以文件后缀是 .groovy

image-20220626114332412

编写脚本

想实现我这样的效果可以直接复制我的代码,也可以发挥你的想象力定制属于你自己的数据提取器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* 用于生成where 条件语句 如
where entity_id_ = '湖北咸宁石油分公司' and entity_name_ = '146' and station_entity_code = '33150451'
*/


SEPARATOR = " and "
QUOTE = "'"
EQUALS = " = "
IS = " is "
STRING_PREFIX = DIALECT.getDbms().isMicrosoft() ? "N" : ""
KEYWORDS_LOWERCASE = com.intellij.database.util.DbSqlUtil.areKeywordsLowerCase(PROJECT)
KW_NULL = KEYWORDS_LOWERCASE ? "null" : "NULL"


ROWS.each { row ->
def values = COLUMNS
.findAll { col -> row.hasValue(col) }
.collect { col ->
new Tuple(col.name(), col, col.name(), row.value(col))
}

def size = values.size().toInteger()
def count = 0
OUT.append("where ")
values.each { name, col, valuesName, value ->
OUT.append("$name")
count++
if (value == null) {
OUT.append(IS)
.append(KW_NULL)
.append(count == size ? "" : SEPARATOR)
}
else {
def stringValue = FORMATTER.formatValue(value, col)
def isStringLiteral = value != null && FORMATTER.isStringLiteral(value, col)
if (isStringLiteral && DIALECT.getDbms().isMysql())
stringValue = stringValue.replace("\\", "\\\\")

OUT.append(EQUALS)
.append(isStringLiteral ? (STRING_PREFIX + QUOTE) : "")
.append(stringValue ? stringValue.replace(QUOTE, QUOTE + QUOTE) : stringValue)
.append(isStringLiteral ? QUOTE : "")
.append(count == size ? "" : SEPARATOR)
}
}
OUT.append("\n")
}


复制之后会自动保存,下次查询时选择你自定义的数据提取器,然后选中数据就会生效啦。

结语

注意 📢: 如果只选中一列数据,是不是生效的。只有选中 > 1列的数据时才会生效。