前面有篇文章提到把datax代码拉到本地打包,是因为可以根据某些需求,去修改里面的代码.
同步数据到pg中,wirteMode使用update,提示不支持。需要修改下postgresqlwriter。
修改postgresqlwriter模块的 PostgresqlWriter.java
上面看到,pg目前(22年8月份) 不支持update
下面对这段代码修改下:
- 解除pg不能使用writeMode:update限制
- 找到最终拼接sql的地方在
plugin-rdbms-util
模块WriterUtil.java
地方
- 对
onConflictUpdateString
方法做如下修改:
public static String onConflictUpdateString(String conflict, List<String> columnHolders) {
conflict = conflict.replace("update", "");
StringBuilder sb = new StringBuilder();
sb.append(" ON CONFLICT ");
sb.append(conflict);
sb.append(" DO ");
if (columnHolders == null || columnHolders.size() < 1) {
sb.append("NOTHING");
return sb.toString();
}
sb.append(" UPDATE SET ");
boolean first = true;
for (String column : columnHolders) {
if (!first) {
sb.append(",");
} else {
first = false;
}
sb.append(column);
sb.append("=excluded.");
sb.append(column); }
return sb.toString();
}
- 打包
为节省打包时间,可以在pom.xml中注掉不需要重新打包的模块,留下公共模块
mvn -U clean package assembly:assembly -Dmaven.test.skip=true
到..\target\datax\datax\plugin\writer
,获取postgresqlwriter
,替换之前的同名文件。
使用
job.json
:
{ ...
"writer":{
"name":"postgresqlwriter",
"writeMode":"update(唯一索引字段)"
}
...
}