通过Python将MongoDB导出的json数据转换成Mysql的insert语句导入

来源:互联网 发布:中建八局 知乎 编辑:程序博客网 时间:2024/05/11 12:29

MongoDB数据导出

首先,MongoDB的数据导出仅支持Json及csv格式,无法直接导入可执行的Mysql数据库脚本。
      所以,要完全将MongoDB的数据导入到Mysql可以通过先导出成Json再使用Python将数据转换成SQL脚本。

     注:由于Python要自己写,且表名字段名啥的只能固定写死,所以该方法仅在将单张表中的数据导入MySql有效,批量多表导入建议采用其他方法。
      至于怎么导出成Json,一般可以直接通过命令行或者通过Mongochef等客户端程序导出。
      我导出的Json示例:
{ "_id" :"55a0dfe539aeef2bd79b38f6", "username" : "巴蒂斯图塔", "patientno" : "000000761"}{ "_id" :"55a1033439aeef4bd194f888", "username" : "周杰伦", "patientno" : "000000770"}{ "_id" :"55a32d4839aeef4bd194f889", "username" : "测试", "patientno" : "000000771"}{ "_id" :"55a3623f39aeef4bd194f88a", "username" : "测试2", "patientno" : "000000772"}
</pre><pre name="code" class="python">Python数据转换
通过Python将json转出sql脚本,首先你得有Python的环境,我的示例代码是Python 2.7的,3.0+的语法不同,请注意。        
1.将上述json数据存入 mongo.json 文件中
2.编写Python脚本:
<pre name="code" class="python">import sysreload(sys)sys.setdefaultencoding('gbk')import jsondata = []with open('mongo.json') as f:    for line in f:        line.encode("gbk");        data.append(json.loads(line,encoding="gbk"))#print json.dumps(data, ensure_ascii=False)str = "\r\n"for item in data:    #print json.dumps(item)    str = str + "insert into t_ecg_report_dynamic(id,username) values "    str = str + "('%s','%s');\r\n" % (item['_id'],item['username'])import codecsfile_object = codecs.open('tencent.sql', 'w' ,"gbk")file_object.write(str)file_object.close()print "success"



注意,由于json中有中文,如果采用gbk uft-8都会出现编码格式问题
错误包括:
(1)UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 51: ordinal
这个错误一般是因为Python默认编码是ascii的,可以在脚本里加上这几句,将默认编码改成你需要的
import sysreload(sys)sys.setdefaultencoding('gbk')
(2)
E:\>python py2.py
Traceback (most recent call last):
  File "py2.py", line 9, in <module>
    data.append(json.loads(line))
  File "E:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "E:\Python27\lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "E:\Python27\lib\json\decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 0: invalid s
tart byte

这一类报错,是因为文件本身是utf-8编码的,运行时候无法识别出文件中的中文字符,加上强制编码修改就行了,注意好像只有gbk才支持中文,utf8好像不行
 data.append(json.loads(line,encoding="gbk"))
(3) 最后成功生成insert语句
insert into t_ecg_report_dynamic(id,username) values ('55a0dfe539aeef2bd79b38f6','巴蒂斯图塔');
insert into t_ecg_report_dynamic(id,username) values ('55a1033439aeef4bd194f888','周杰伦');
insert into t_ecg_report_dynamic(id,username) values ('55a32d4839aeef4bd194f889','测试');
insert into t_ecg_report_dynamic(id,username) values ('55a3623f39aeef4bd194f88a','测试2');



0 0