Datax 同步数据到Postgres 增量更新

214 阅读1分钟

前面有篇文章提到把datax代码拉到本地打包,是因为可以根据某些需求,去修改里面的代码.

同步数据到pg中,wirteMode使用update,提示不支持。需要修改下postgresqlwriter。
修改postgresqlwriter模块的 PostgresqlWriter.java

image.png

上面看到,pg目前不支持update
下面对这段代码修改下:

  • 解除pg不能使用writeMode:update限制
  • 找到最终拼接sql的地方在plugin-rdbms-util模块 WriterUtil.java地方

image.png

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中注掉不需要重新打包的模块,留下公共模块

image.png

mvn -U clean package assembly:assembly -Dmaven.test.skip=true

..\target\datax\datax\plugin\writer,获取postgresqlwriter,替换之前的同名文件。

使用

{   ...  
    "writer":{    
        "name":"postgresqlwriter",    
        "writeMode":"update(唯一索引字段)"  
    }  
    ...
}