mirror of
https://github.com/moshowgame/SpringBootCodeGenerator.git
synced 2026-06-04 09:01:03 +08:00
Compare commits
6 Commits
2022.02.09
...
20230101
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc123b8f27 | ||
|
|
107c1035e5 | ||
|
|
37e83ef76c | ||
|
|
781a7ff4ca | ||
|
|
a658ff5a0b | ||
|
|
aac82f2109 |
5
@install.cmd
Normal file
5
@install.cmd
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
REM JDK must equal or more than : 11
|
||||||
|
java -version
|
||||||
|
REM maven installing libraries
|
||||||
|
mvn clean compile
|
||||||
|
pause
|
||||||
4
@run.cmd
Normal file
4
@run.cmd
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
java -jar "./generator-web/target/generator-web-3.0.jar"
|
||||||
|
pause
|
||||||
|
mvn clean compile package
|
||||||
|
pause
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
> 愿大家可以维持生活和工作平衡,保持健康和安全,祝大家工作顺利!
|
> 愿大家可以维持生活和工作平衡,保持健康和安全,祝大家工作顺利!
|
||||||
|
|
||||||
# Tips or Features
|
# Tips or Features
|
||||||
- 支持DDL SQL/INSERT SQL/SIMPLE JSON三种生成模式
|
- 支持`DDL SQL`/`INSERT SQL`/`SIMPLE JSON`三种生成模式
|
||||||
- `自动记忆`最近生成的内容,最多保留9个
|
- `自动记忆`最近生成的内容,最多保留9个
|
||||||
- 提供众多`通用模板`,易于使用,复制粘贴加简单修改即可完成CRUD操作
|
- 提供众多`通用模板`,易于使用,复制粘贴加简单修改即可完成CRUD操作
|
||||||
- 支持`特殊字符`模板(`#`请用`井`代替;`$`请用`¥`代替)
|
- 支持`特殊字符`模板(`#`请用`井`代替;`$`请用`¥`代替)
|
||||||
@@ -59,7 +59,10 @@ Thanks for `JetBrains` providing us the `Licenses for Open Source Development`
|
|||||||
|
|
||||||
# Update Logs
|
# Update Logs
|
||||||
| 更新日期 | 更新内容 |
|
| 更新日期 | 更新内容 |
|
||||||
|:------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|:-----------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| 2023.01.01 | 新增GCP BigQuery/Dataflow JJS/QlikSense BI模板。 |
|
||||||
|
| 2022.09.28 | MySQL to Java type conversion 数据库类型转换优化(感谢@jadelike得贡献) |
|
||||||
|
| 2022.07.02 | add the script to install and run,添加批处理以便直接构建或运行项目。 |
|
||||||
| 2022.02.10 | 更新springboot、fastjson、lombok依赖(感谢@Abbykawai的建议)。 |
|
| 2022.02.10 | 更新springboot、fastjson、lombok依赖(感谢@Abbykawai的建议)。 |
|
||||||
| 2022.02.09 | 新增JPA-STARP模板(感谢@starplatinum3的贡献)。 |
|
| 2022.02.09 | 新增JPA-STARP模板(感谢@starplatinum3的贡献)。 |
|
||||||
| 2022.01.11 | 优化mybatis的mapper文件生成(感谢@chendong的贡献)。 |
|
| 2022.01.11 | 优化mybatis的mapper文件生成(感谢@chendong的贡献)。 |
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.softdev.system.generator.util;
|
package com.softdev.system.generator.util;
|
||||||
|
|
||||||
|
import com.softdev.system.generator.util.mysqlJavaTypeUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
@@ -196,84 +196,25 @@ public class TableParseUtil {
|
|||||||
fieldName = columnName;
|
fieldName = columnName;
|
||||||
}
|
}
|
||||||
columnLine = columnLine.substring(columnLine.indexOf("`") + 1).trim();
|
columnLine = columnLine.substring(columnLine.indexOf("`") + 1).trim();
|
||||||
|
String mysqlType = columnLine.split("\\s+")[1];
|
||||||
|
if(mysqlType.contains("(")){
|
||||||
|
mysqlType = mysqlType.substring(0, mysqlType.indexOf("("));
|
||||||
|
}
|
||||||
//swagger class
|
//swagger class
|
||||||
String swaggerClass = "string" ;
|
String swaggerClass = "string" ;
|
||||||
if (columnLine.contains(" tinyint")) {
|
if(mysqlJavaTypeUtil.getMysqlSwaggerTypeMap().containsKey(mysqlType)){
|
||||||
swaggerClass = "integer";
|
swaggerClass = mysqlJavaTypeUtil.getMysqlSwaggerTypeMap().get(mysqlType);
|
||||||
} else if (columnLine.contains(" int") || columnLine.contains(" smallint")) {
|
|
||||||
swaggerClass = "integer";
|
|
||||||
} else if (columnLine.contains(" bigint")) {
|
|
||||||
swaggerClass = "integer";
|
|
||||||
} else if (columnLine.contains(" float")) {
|
|
||||||
swaggerClass = "number";
|
|
||||||
} else if (columnLine.contains(" double")) {
|
|
||||||
swaggerClass = "number";
|
|
||||||
} else if (columnLine.contains(" boolean")) {
|
|
||||||
swaggerClass = "boolean";
|
|
||||||
}
|
}
|
||||||
// field class
|
// field class
|
||||||
// int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
|
// int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
|
||||||
String fieldClass = Object.class.getSimpleName();
|
String fieldClass = "String";
|
||||||
//2018-9-16 zhengk 补充char/clob/blob/json等类型,如果类型未知,默认为String
|
//2018-9-16 zhengk 补充char/clob/blob/json等类型,如果类型未知,默认为String
|
||||||
//2018-11-22 lshz0088 处理字段类型的时候,不严谨columnLine.contains(" int") 类似这种的,可在前后适当加一些空格之类的加以区分,否则当我的字段包含这些字符的时候,产生类型判断问题。
|
//2018-11-22 lshz0088 处理字段类型的时候,不严谨columnLine.contains(" int") 类似这种的,可在前后适当加一些空格之类的加以区分,否则当我的字段包含这些字符的时候,产生类型判断问题。
|
||||||
//2020-05-03 MOSHOW.K.ZHENG 优化对所有类型的处理
|
//2020-05-03 MOSHOW.K.ZHENG 优化对所有类型的处理
|
||||||
//2020-10-20 zhengkai 新增包装类型的转换选择
|
//2020-10-20 zhengkai 新增包装类型的转换选择
|
||||||
if (columnLine.contains(" tinyint")) {
|
if(mysqlJavaTypeUtil.getMysqlJavaTypeMap().containsKey(mysqlType)){
|
||||||
//20191115 MOSHOW.K.ZHENG 支持对tinyint的特殊处理
|
fieldClass = mysqlJavaTypeUtil.getMysqlJavaTypeMap().get(mysqlType);
|
||||||
fieldClass = MapUtil.getString(paramInfo.getOptions(),"tinyintTransType");;
|
|
||||||
} else if (columnLine.contains(" int") || columnLine.contains(" smallint")) {
|
|
||||||
fieldClass = (isPackageType)?Integer.class.getSimpleName():"int";
|
|
||||||
} else if (columnLine.contains(" bigint")) {
|
|
||||||
fieldClass = (isPackageType)?Long.class.getSimpleName():"long";
|
|
||||||
} else if (columnLine.contains(" float")) {
|
|
||||||
fieldClass = (isPackageType)?Float.class.getSimpleName():"float";
|
|
||||||
} else if (columnLine.contains(" double")) {
|
|
||||||
fieldClass = (isPackageType)?Double.class.getSimpleName():"double";
|
|
||||||
} else if (columnLine.contains(" time") || columnLine.contains(" date") || columnLine.contains(" datetime") || columnLine.contains(" timestamp")) {
|
|
||||||
fieldClass = MapUtil.getString(paramInfo.getOptions(),"timeTransType");
|
|
||||||
} else if (columnLine.contains(" varchar") || columnLine.contains(" text") || columnLine.contains(" char")
|
|
||||||
|| columnLine.contains(" clob") || columnLine.contains(" blob") || columnLine.contains(" json")) {
|
|
||||||
fieldClass = String.class.getSimpleName();
|
|
||||||
} else if (columnLine.contains(" decimal") || columnLine.contains(" number")) {
|
|
||||||
//2018-11-22 lshz0088 建议对number类型增加int,long,BigDecimal的区分判断
|
|
||||||
//如果startKh大于等于0,则表示有设置取值范围
|
|
||||||
int startKh = columnLine.indexOf("(");
|
|
||||||
if (startKh >= 0) {
|
|
||||||
int endKh = columnLine.indexOf(")", startKh);
|
|
||||||
String[] fanwei = columnLine.substring(startKh + 1, endKh).split(",");
|
|
||||||
//2019-1-5 zhengk 修复@arthaschan反馈的超出范围错误
|
|
||||||
//System.out.println("fanwei"+ JSON.toJSONString(fanwei));
|
|
||||||
// //number(20,6) fanwei["20","6"]
|
|
||||||
// //number(0,6) fanwei["0","6"]
|
|
||||||
// //number(20,0) fanwei["20","0"]
|
|
||||||
// //number(20) fanwei["20"]
|
|
||||||
//如果括号里是1位或者2位且第二位为0,则进行特殊处理。只有有小数位,都设置为BigDecimal。
|
|
||||||
if ((fanwei.length > 1 && "0".equals(fanwei[1])) || fanwei.length == 1) {
|
|
||||||
int length = Integer.parseInt(fanwei[0]);
|
|
||||||
if (fanwei.length > 1) {
|
|
||||||
length = Integer.valueOf(fanwei[1]);
|
|
||||||
}
|
}
|
||||||
//数字范围9位及一下用Integer,大的用Long
|
|
||||||
if (length <= 9) {
|
|
||||||
fieldClass = (isPackageType)?Integer.class.getSimpleName():"int";
|
|
||||||
} else {
|
|
||||||
fieldClass = (isPackageType)?Long.class.getSimpleName():"long";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//有小数位数一律使用BigDecimal
|
|
||||||
fieldClass = BigDecimal.class.getSimpleName();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fieldClass = BigDecimal.class.getSimpleName();
|
|
||||||
}
|
|
||||||
} else if (columnLine.contains(" boolean")) {
|
|
||||||
//20190910 MOSHOW.K.ZHENG 新增对boolean的处理(感谢@violinxsc的反馈)以及修复tinyint类型字段无法生成boolean类型问题(感谢@hahaYhui的反馈)
|
|
||||||
fieldClass = (isPackageType)?Boolean.class.getSimpleName():"boolean";
|
|
||||||
} else {
|
|
||||||
fieldClass = String.class.getSimpleName();
|
|
||||||
}
|
|
||||||
|
|
||||||
// field comment,MySQL的一般位于field行,而pgsql和oralce多位于后面。
|
// field comment,MySQL的一般位于field行,而pgsql和oralce多位于后面。
|
||||||
String fieldComment = null;
|
String fieldComment = null;
|
||||||
if (tableSql.contains("comment on column") && (tableSql.contains("." + columnName + " is ") || tableSql.contains(".`" + columnName + "` is"))) {
|
if (tableSql.contains("comment on column") && (tableSql.contains("." + columnName + " is ") || tableSql.contains(".`" + columnName + "` is"))) {
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package com.softdev.system.generator.util;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lvyanpu
|
||||||
|
*/
|
||||||
|
public final class mysqlJavaTypeUtil {
|
||||||
|
public static final HashMap<String, String> mysqlJavaTypeMap = new HashMap<String, String>();
|
||||||
|
public static final HashMap<String, String> mysqlSwaggerTypeMap =new HashMap<String, String>();
|
||||||
|
|
||||||
|
static{
|
||||||
|
mysqlJavaTypeMap.put("bigint","Long");
|
||||||
|
mysqlJavaTypeMap.put("int","Integer");
|
||||||
|
mysqlJavaTypeMap.put("tinyint","Integer");
|
||||||
|
mysqlJavaTypeMap.put("smallint","Integer");
|
||||||
|
mysqlJavaTypeMap.put("mediumint","Integer");
|
||||||
|
mysqlJavaTypeMap.put("integer","Integer");
|
||||||
|
//小数
|
||||||
|
mysqlJavaTypeMap.put("float","Float");
|
||||||
|
mysqlJavaTypeMap.put("double","Double");
|
||||||
|
mysqlJavaTypeMap.put("decimal","Double");
|
||||||
|
//bool
|
||||||
|
mysqlJavaTypeMap.put("bit","Boolean");
|
||||||
|
//字符串
|
||||||
|
mysqlJavaTypeMap.put("char","String");
|
||||||
|
mysqlJavaTypeMap.put("varchar","String");
|
||||||
|
mysqlJavaTypeMap.put("tinytext","String");
|
||||||
|
mysqlJavaTypeMap.put("text","String");
|
||||||
|
mysqlJavaTypeMap.put("mediumtext","String");
|
||||||
|
mysqlJavaTypeMap.put("longtext","String");
|
||||||
|
//日期
|
||||||
|
mysqlJavaTypeMap.put("date","Date");
|
||||||
|
mysqlJavaTypeMap.put("datetime","Date");
|
||||||
|
mysqlJavaTypeMap.put("timestamp","Date");
|
||||||
|
|
||||||
|
|
||||||
|
mysqlSwaggerTypeMap.put("bigint","integer");
|
||||||
|
mysqlSwaggerTypeMap.put("int","integer");
|
||||||
|
mysqlSwaggerTypeMap.put("tinyint","integer");
|
||||||
|
mysqlSwaggerTypeMap.put("smallint","integer");
|
||||||
|
mysqlSwaggerTypeMap.put("mediumint","integer");
|
||||||
|
mysqlSwaggerTypeMap.put("integer","integer");
|
||||||
|
mysqlSwaggerTypeMap.put("boolean","boolean");
|
||||||
|
mysqlSwaggerTypeMap.put("float","number");
|
||||||
|
mysqlSwaggerTypeMap.put("double","number");
|
||||||
|
mysqlSwaggerTypeMap.put("decimal","Double");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HashMap<String, String> getMysqlJavaTypeMap() {
|
||||||
|
return mysqlJavaTypeMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HashMap<String, String> getMysqlSwaggerTypeMap() {
|
||||||
|
return mysqlSwaggerTypeMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -47,7 +47,7 @@ spring:
|
|||||||
#mvc:
|
#mvc:
|
||||||
# static-path-pattern: /statics/**
|
# static-path-pattern: /statics/**
|
||||||
OEM:
|
OEM:
|
||||||
version: 3.2
|
version: 2023.1
|
||||||
header: SQL转Java JPA、MYBATIS实现类代码生成平台
|
header: SQL转Java JPA、MYBATIS实现类代码生成平台
|
||||||
keywords: sql转实体类,sql转DAO,SQL转service,SQL转JPA实现,SQL转MYBATIS实现
|
keywords: sql转实体类,sql转DAO,SQL转service,SQL转JPA实现,SQL转MYBATIS实现
|
||||||
title: JAVA在线代码生成
|
title: JAVA在线代码生成
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ spring:
|
|||||||
#mvc:
|
#mvc:
|
||||||
# static-path-pattern: /statics/**
|
# static-path-pattern: /statics/**
|
||||||
OEM:
|
OEM:
|
||||||
version: 3.2
|
version: 2023.1
|
||||||
header: SQL转Java JPA、MYBATIS实现类代码生成平台
|
header: SQL转Java JPA、MYBATIS实现类代码生成平台
|
||||||
keywords: sql转实体类,sql转DAO,SQL转service,SQL转JPA实现,SQL转MYBATIS实现
|
keywords: sql转实体类,sql转DAO,SQL转service,SQL转JPA实现,SQL转MYBATIS实现
|
||||||
title: JAVA代码生成平台
|
title: JAVA代码生成平台
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ spring:
|
|||||||
#mvc:
|
#mvc:
|
||||||
# static-path-pattern: /statics/**
|
# static-path-pattern: /statics/**
|
||||||
OEM:
|
OEM:
|
||||||
version: 3.2
|
version: 2023.1
|
||||||
header: SQL转Java JPA、MYBATIS实现类代码生成平台
|
header: SQL转Java JPA、MYBATIS实现类代码生成平台
|
||||||
keywords: sql转实体类,sql转DAO,SQL转service,SQL转JPA实现,SQL转MYBATIS实现
|
keywords: sql转实体类,sql转DAO,SQL转service,SQL转JPA实现,SQL转MYBATIS实现
|
||||||
title: JAVA在线代码生成
|
title: JAVA在线代码生成
|
||||||
|
|||||||
@@ -230,7 +230,6 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"group": "jpa-starp",
|
"group": "jpa-starp",
|
||||||
"templates": [{
|
"templates": [{
|
||||||
@@ -249,5 +248,28 @@
|
|||||||
"description": "jpacontroller"
|
"description": "jpacontroller"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "bi",
|
||||||
|
"templates": [{
|
||||||
|
"id": "201",
|
||||||
|
"name": "qliksense",
|
||||||
|
"description": "qlik sense"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "cloud",
|
||||||
|
"templates": [
|
||||||
|
{
|
||||||
|
"id": "301",
|
||||||
|
"name": "bigquery",
|
||||||
|
"description": "GCP BigQuery"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "302",
|
||||||
|
"name": "dataflowjjs",
|
||||||
|
"description": "GCP Dataflow JJS"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
//***************************
|
||||||
|
//[${classInfo.classComment} - ${classInfo.tableName}]
|
||||||
|
//AUTHOR ${authorName}
|
||||||
|
//HISTORY ${.now?string('yyyy-MM-dd')}
|
||||||
|
//***************************
|
||||||
|
|
||||||
|
//***************************
|
||||||
|
//load all
|
||||||
|
[${classInfo.tableName}]:
|
||||||
|
LOAD * FROM ['LIB://QVD/${classInfo.className}.qvd'](qvd);
|
||||||
|
|
||||||
|
//***************************
|
||||||
|
//load columns
|
||||||
|
[${classInfo.tableName}]:
|
||||||
|
LOAD
|
||||||
|
<#list classInfo.fieldList as fieldItem >
|
||||||
|
"${fieldItem.columnName}" as "${fieldItem.fieldName}"<#if fieldItem_has_next>,</#if>
|
||||||
|
</#list>
|
||||||
|
FROM
|
||||||
|
['LIB://QVD/${classInfo.className}.qvd'](qvd);
|
||||||
|
;
|
||||||
|
|
||||||
|
//load inline
|
||||||
|
[${classInfo.tableName}]:
|
||||||
|
LOAD * INLINE
|
||||||
|
[
|
||||||
|
<#list classInfo.fieldList as fieldItem >${fieldItem.columnName} <#if fieldItem_has_next>,</#if></#list>
|
||||||
|
<#list classInfo.fieldList as fieldItem >${fieldItem.fieldName} <#if fieldItem_has_next>,</#if></#list>
|
||||||
|
<#list classInfo.fieldList as fieldItem >${fieldItem.fieldComment} <#if fieldItem_has_next>,</#if></#list>
|
||||||
|
];
|
||||||
|
|
||||||
|
//***************************
|
||||||
|
//load from api data connection (wrap on)
|
||||||
|
LIB CONNECT TO '${classInfo.tableName}_api';
|
||||||
|
|
||||||
|
RestConnectorMasterTable:
|
||||||
|
SQL SELECT
|
||||||
|
"__KEY_root",
|
||||||
|
(SELECT
|
||||||
|
<#list classInfo.fieldList as fieldItem >
|
||||||
|
"${fieldItem.columnName}"
|
||||||
|
</#list>
|
||||||
|
"__FK_object"
|
||||||
|
FROM "object" FK "__FK_object")
|
||||||
|
FROM JSON (wrap on) "root" PK "__KEY_root"
|
||||||
|
// WITH CONNECTION (
|
||||||
|
// Url "https://localhost:8080/${classInfo.tableName}_api",
|
||||||
|
// QUERY "page" "1",
|
||||||
|
// QUERY "size" "100",
|
||||||
|
// HTTPHEADER "token" "123456",
|
||||||
|
// BODY "Post body here")
|
||||||
|
;
|
||||||
|
|
||||||
|
[${classInfo.className}]:
|
||||||
|
LOAD
|
||||||
|
<#list classInfo.fieldList as fieldItem >
|
||||||
|
[${fieldItem.columnName}] as [${fieldItem.fieldName}]
|
||||||
|
</#list>
|
||||||
|
[__FK_object] AS [__KEY_root]
|
||||||
|
RESIDENT RestConnectorMasterTable
|
||||||
|
WHERE NOT IsNull([__FK_stores]);
|
||||||
|
|
||||||
|
DROP TABLE [${classInfo.className}];
|
||||||
|
DROP TABLE RestConnectorMasterTable;
|
||||||
|
|
||||||
|
//***************************
|
||||||
|
//load from api data connection (wrap off)
|
||||||
|
LIB CONNECT TO '${classInfo.tableName}_api';
|
||||||
|
[${classInfo.className}]:
|
||||||
|
SQL SELECT
|
||||||
|
<#list classInfo.fieldList as fieldItem >
|
||||||
|
[${fieldItem.fieldName}] as [${fieldItem.fieldName}]<#if fieldItem_has_next>,</#if>
|
||||||
|
</#list>
|
||||||
|
FROM JSON(wrap off) "${classInfo.className}"
|
||||||
|
// WITH CONNECTION (
|
||||||
|
// Url "https://localhost:8080/${classInfo.tableName}_api",
|
||||||
|
// QUERY "page" "1",
|
||||||
|
// QUERY "size" "100",
|
||||||
|
// HTTPHEADER "token" "123456",
|
||||||
|
// BODY "Post body here")
|
||||||
|
;
|
||||||
|
|
||||||
|
//***************************
|
||||||
|
//load from sql data connection
|
||||||
|
LIB CONNECT TO '${classInfo.tableName}_db';
|
||||||
|
|
||||||
|
SQL SELECT
|
||||||
|
<#list classInfo.fieldList as fieldItem >
|
||||||
|
[${fieldItem.columnName}] as [${fieldItem.fieldName}]<#if fieldItem_has_next>,</#if>
|
||||||
|
</#list>
|
||||||
|
FROM
|
||||||
|
${classInfo.tableName}
|
||||||
|
WHERE
|
||||||
|
Create_Time > '2023-01-01 00:00:00';
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
SELECT * FROM 'your_project.your_dataset.${tableName}' t
|
||||||
|
order by t.id desc
|
||||||
|
LIMIT 100
|
||||||
|
;
|
||||||
|
|
||||||
|
SELECT * FROM 'your_project.your_dataset.${tableName}_error_records' t
|
||||||
|
order by t.timestamp desc
|
||||||
|
LIMIT 100
|
||||||
|
;
|
||||||
|
|
||||||
|
bigquery table -> SCHEMA -> Edit as text , then input below text:
|
||||||
|
[
|
||||||
|
<#list classInfo.fieldList as fieldItem >
|
||||||
|
{"name":"${fieldItem.columnName}",type:"STRING","mode":"NULLABLE","description": "${fieldItem.fieldName} - ${fieldItem.fieldComment}"}<#if fieldItem_has_next>,</#if>
|
||||||
|
</#list>
|
||||||
|
]
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/**
|
||||||
|
* GCP - dataflow job jjs for [${classInfo.classComment} - ${classInfo.tableName}]
|
||||||
|
* AUTHOR ${authorName}
|
||||||
|
*
|
||||||
|
* User-defined function (UDF) to transform events as part of a Dataflow template job.
|
||||||
|
* upload to GCS and create dataflow job with this js file and method as 'process'
|
||||||
|
* @param {string} inJson input Pub/Sub JSON message (stringified)
|
||||||
|
* @return {string} outJson output JSON message (stringified)
|
||||||
|
*/
|
||||||
|
function process(inJson) {
|
||||||
|
//for local js debug
|
||||||
|
//var obj = JSON.parse(JSON.stringify(inJson));
|
||||||
|
//for online jjs
|
||||||
|
var obj = JSON.parse(inJson);
|
||||||
|
var includePubsubMessage = obj.data && obj.attributes;
|
||||||
|
var data = includePubsubMessage ? obj.data : obj;
|
||||||
|
//debug and show error if you need special logic
|
||||||
|
if(data.hasOwnProperty('show_error')){
|
||||||
|
throw new ERROR("show_error:"+JSON.stringify(data))
|
||||||
|
}
|
||||||
|
// INSERT CUSTOM TRANSFORMATION LOGIC HERE
|
||||||
|
var tableObj= {};
|
||||||
|
tableObj.insert_time=new Date().toUTCString()
|
||||||
|
<#list classInfo.fieldList as fieldItem >
|
||||||
|
tableObj.${fieldItem.columnName}=data.${fieldItem.fieldName}
|
||||||
|
</#list>
|
||||||
|
return JSON.stringify(tableObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
//field name = field name
|
||||||
|
<#list classInfo.fieldList as fieldItem >
|
||||||
|
tableObj.${fieldItem.fieldName}=data.${fieldItem.fieldName}
|
||||||
|
</#list>
|
||||||
|
|
||||||
|
//column name = column name
|
||||||
|
<#list classInfo.fieldList as fieldItem >
|
||||||
|
tableObj.${fieldItem.columnName}=data.${fieldItem.columnName}
|
||||||
|
</#list>
|
||||||
2
pom.xml
2
pom.xml
@@ -49,7 +49,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>fastjson</artifactId>
|
<artifactId>fastjson</artifactId>
|
||||||
<version>1.2.79</version>
|
<version>1.2.83</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 支持 @ConfigurationProperties 注解 -->
|
<!-- 支持 @ConfigurationProperties 注解 -->
|
||||||
|
|||||||
Reference in New Issue
Block a user