有一个数据迁移的工作,需要把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()

 

 

相关文章: