Python解析MongoDB数据存入MySQL

Python解析MongoDB数据存入MySQL


直接放解析代码

import pymongo as pyg
import datetime
import into_mysql  #导入MySQL类(将解析后的MongoDB数据插入到MySQL中)

# 填入自己的MongoDB的IP、帐号、密码

conn = pyg.MongoClient('172.00.00.000',27001, username='******', password='************')
mydb = conn["*****l"] #自己的库名
mycol = mydb["*******"] #自己的表名

#自定义解析时间,如果MongoDB中有对应时间字段,可以设置从哪里开始解析
#start = datetime.datetime(2019, 6, 1,00,00,00)
#设置解析到哪里结束
#end = datetime.datetime(2019, 8, 20,00,00,00)
#查询主体 myqurey 如果自定义时间段,则使用这个 myqurey 
#myqurey = {"createTime":{"$gt":start,"$lte":end}}

#全量解析数据的 myqurey ,使用这个myqurey  ,则默认全量解析数据 
myqurey = {}
result=mycol.find(myqurey)
json_value = result
count = -1

#将解析后的多个字段,暂存到集合中
new_list=[]
# 无限循环解析数据,这里也可以用for循环,但是for循环可能会遇到解析一点数据就报错,下面放for循环不报错解析
while True:
        count = count+1
        print(count)
        # 1  解析第一个字段
        try:
           #增加字段容错,如果取数报错,可以设置一个错误值,或者置null
            idCode = json_value[count]["idCode"]
            if idCode is None or idCode == "":
                idCode = '-999'
        except:
            idCode = '-999'
       # 将解析后的字段放入集合中     
        new_list.append(idCode)

        # 2  解析第二个字段,如果需要增加字段,自己增加即可
        try:
            phone = json_value[count]["phone"]
            if phone is None or phone == "":
                phone = '-999'
        except:
            phone = '-999'
        new_list.append(phone)

        # 取出MongoDB入数据库的时间(如果有时间字段,可以解析时间)
        createTime = str(json_value[count]["createTime"])[:19]
        createTime = datetime.datetime.strptime(createTime, "%Y-%m-%d %H:%M:%S")
        # 当前时间
        insertTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        new_list.append(createTime) 
        new_list.append(insertTime) 
        print(jxlCarrierTaskCreateCallBackBean)

        # 把解析后的数据插入到mysql数据库
        into_mysql.insert_mysql(new_list)
        #将集合置空
        new_list[:] = []

into_mysql类

# 导入包
import pymysql
#插入MySQL数据的方法,将集合中的内容插入到MySQL表中
def insert_mysql(s=[]):
#你的MySQL地址,帐号,密码,端口号,库名,字符集
 conn = pymysql.connect(host='********', user='root', passwd='*******', port=3306, db='test', charset='utf8')
 cur = conn.cursor()
 
#插入语句,对应集合中的字段
 sql = "insert into test01( id,name,insertTime,updt) values (\"%s\",\"%s\",\"%s\",\"%s\")" % (s[0], s[1], s[2], s[3])
 
 print(sql)
 cur.execute(sql)
 conn.commit()

for循环解析
总体上是没什么区别的,只是for循环需要对时间进行切片,最好是每小时一个切片,这样可以保证不会出现报错

import pymongo as pyg
import datetime
import into_mysql_json_03
import time
import pandas as pd
from sqlalchemy import create_engine

conn = pyg.MongoClient('***********',27001, username='**********', password='*********')
mydb = conn["******"]
mycol = mydb["*******"]
count = 0
#定义时间切片次数,这个随意定义一个,可以是MongoDB中数据的总量
list = range(0,100000)
#切片开始时间 2018-11-19 07:21:11.825Z
start = datetime.datetime(2019, 8, 13, 15, 00, 00)
#切片结束时间
end = datetime.datetime(2019, 8, 13, 16, 00, 00)
#时间循环
for i in list:
    #时间切片的频次
    start = start + datetime.timedelta(hours=1)
    end = end + datetime.timedelta(hours=1)
    print(start)
    print(end)
    myqurey = {"createTime":{"$gt":start,"$lte":end}}
    #运行sql
    #myqurey = {}
    demos = mycol.find(myqurey,no_cursor_timeout = True)#,no_cursor_timeout = True
    #解析详细内容
    for json_value in demos:

        #存放时间的list
        time_list = []

        #主键
        Code= json_value['Code']
        print(Code)

        #MongoDB的数据创建时间
        createTime = str(json_value["createTime"])[:19]
        createTime = datetime.datetime.strptime(createTime, "%Y-%m-%d %H:%M:%S")
        time_list.append(createTime)

        # MongoDB解析数据插入mysql数据的时间
        insertTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        #插入到之前定义的time_list中
        time_list.append(insertTime)

        #解析详细数据
        try:
            #存放解析出来的list
            new_list= []

            #存放主键
            new_list.append(Code)

            #1
            try:
                new_list.append(json_value['解析的字名'])
            except:
                new_list.append('null')

            #2
            try:
                new_list.append(json_value['result_verify']['tl_cell_lasttime'])
            except:
                new_list.append('null')


            #添加之前的时间list
            new_list.extend(time_list)
            print(new_list)

            #into_mysql.insert_mysql(new_list)

            print('入库成功')


        except:

            print('错误')

    demos.close()

解析MongoDB还会遇到例如多层级数据解析的问题, 我的解决方法是循环套循环,而且比较麻烦,容易出错,这里就不放上来了,如果有大神有更好的解析方案,希望能共享出来学习一下。

  • MongoDB的 0 下面可能还有新的 0 1 这样的结构MongoDB的 0 下面可能还有新的 0 1 这样的结构。

我这个写的比较简陋,但是介于现在很多解析方法都使用都有问题,不能很好的处理解析需求,如果有更好更快的方法可以共享出来

你可能感兴趣的:(Python解析MongoDB数据存入MySQL)