有一个数据迁移的工作,需要把A数据库的两张表的内容关联起来,根据条件导入到各个分库中,分库的库名在A库查询出来的一个字段中.简而言之就是根据结果集把数据倒入不同的数据库中。
一,kettle 首先想到了使用kettle,根据查询的条件设置变量,然后在kettle中插入地方的数据库连接使用相应的变量设置,变量的设置如下图:
然后数据流转。
二、shell 然后线上执行kettle脚本要同时连接来源库和目标库,我们没有这个环境同时可以连接两个库,而且怕有风险,所以修改使用脚本导出插入到每个数据库的sql脚本,首先想到了使用shell脚本编写,直接执行mysql的命令,大概逻辑如下
for data in `{这里写sql命令};' |grep wiota | sed -e 's/\t/=/g' | sed 's/[ ]/%/g'` ;do
## 一些特殊字符需要先替换然后再替换回来
arrays[index++]=$data;
done
echo '记录总条数'${#arrays[@]};
for item in ${arrays[@]}; do
arr=(${item//=/ })
{这里处理切分出来后的结果}
echo '{插入的sql} | sed -e 's/%/ /g'>> oasHotelInfo.sql
done
三、 python 然后发现结果集中有空字符串,然后shell拆分的时候结果会少,例如,,拆分出来会只有两个结果,少一个结果会,所以就切换成python编写。大概流程如下
#dev database
con = mdb.connect(host='192.168.0.1m', port=3306, user='test', passwd='111111', db='test', charset='utf8')
cur=con.cursor()
f = codecs.open('rs.sql', 'w+', 'utf-8')
try:
cur.execute('{此处写sql内容}')
f.write('set names utf8;\n')
for data in cur.fetchall():
temp = data[0]
id = data[1]
end = temp.find('.')
db_name = 'db_'+domain[0:end]
sql = 'INSERT INTO %s.tableName (colName) values(%s);' % (db_name,id)
f.write(sql)
print 'done'
finally:
f.close()
cur.close()
con.close()