alibaba / DataX

DataX是阿里云DataWorks数据集成的开源版本。
Other
15.9k stars 5.42k forks source link

column作为变量传到json中解析不正确 #1976

Open luck001221 opened 12 months ago

luck001221 commented 12 months ago

reader中配置 “querysql”:["${sql}"] writer 中配置 “column”:["${incolumns}"]

无论我怎么传-Dcolumns的参数 python datax.py x.json -p "-Dsql=\" select id,name from tbxx\" -Dcolumns=id,name"

python datax.py x.json -p "-Dsql=\" select id,name from tbxx\" -Dcolumns=\"id\",\"name\" "

python datax.py x.json -p "-Dsql=\" select id,name from tbxx\" -Dcolumns="id","name""

执行的时候看到的x.json都解析成了“column”:["id,name"] 求怎么能让x.json解析成 “column”:["id","name"]

FuYouJ commented 12 months ago

"columns": ["$col2"] -Dcol2 = name\",\"name2\",\"name3

关键在于中间带引号,靠近括号的地方开始和结束不带。注意添加斜杠转义字符

zbz419531819 commented 12 months ago

“列”: [“$col 2”] -Dcol2 = 名称“,”名称 2“,”名称 3

关键在于中间带引号,靠近括号的地方开始和结束不带。注意添加斜杠转义字符

这个不行呀...使用\斜杠做转义也没法正常传递 -DcolumnList=id\",\"username\",\"mobile\",\"create_time\",\"update_time

FuYouJ commented 12 months ago

“列”: [“$col 2”] -Dcol2 = 名称“,”名称 2“,”名称 3 关键在于中间带引号,靠近括号的地方开始和结束不带。注意添加斜杠转义字符

这个不行呀...使用\斜杠做转义也没法正常传递 -DcolumnList=id","username","mobile","create_time","update_time

楼主成功了,你是不是shell启动,shell 还得多加一个斜杠

zbz419531819 commented 12 months ago

``python /app/sinova/zbz/datax_oracle_new/datax/bin/datax.py -p "-DcolumnList=id\",\"username\",\"mobile\",\"create_time\",\"update_time" /app/sinova/zbz/datax_oracle_new/oracle_test.json 执行的这个 不行

FuYouJ commented 12 months ago

``python /app/sinova/zbz/datax_oracle_new/datax/bin/datax.py -p "-DcolumnList=id\",\"username\",\"mobile\",\"create_time\",\"update_time" /app/sinova/zbz/datax_oracle_new/oracle_test.json 执行的这个 不行 三个斜杠

luck001221 commented 11 months ago

我最后试验成功了,总结了一下,还是因为shell命令最基本的单引号和双引号理解不够透彻导致的。 首先明确一点最终传递到-Dcolumn里面的应该是 id","name","filesize 这个字符串,前后的双引号是省略的。

剩下的就是shell调用python的时候,双引号和单引号的问题。 function exp { echo $1 $2 $3 sql=$1 column=${2//,/\",\"} postsql=${3//;/\\\";\\\"} echo $sql $column $postsql python xxx.json -p "-Dsql=\"$sql\" -Dcolumn='$column' -Dpostsql=\"$postsql\" " }

exp "select '1' as id,filename,filesize from tb" "id,filename,filesize" "select 1; select 2"

column在执行的时候是单引号引用的,函数内将逗号换成双引号逗号双引号,转义双引号 postsql在执行的时候是双引号引用的,函数内将分号换成双引号分号双引号。转义双引号,反斜杠需要再次转义。

sql参数中如果使用了单引号转列名的时候,执行的语句中用双引号将sql引起来,以前也有不少兄弟遇到过这种问题。

还有就是presql和postsql,,其实如果要执行两条语句,在执行数据同步,直接传递“select 1;select2“ 是不行的 应该传“select 1” “select 2”,按照我们的本意是两条语句直接执行用分号隔开,但是datax,一次不能执行2条语句,要一条一条的执行。

zbz419531819 commented 11 months ago

最后我在执行脚本的python中进行修改.json文件解决的,执行前先修改json文件正常