首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python采用并发查询mysql以及调用API灌数据 (六)- 解决datetime序列化json格式问题

前情回顾

上一篇文章已经编写了mysql查询以及生成请求api的body数据,那么本章节我们来继续编写解决body序列化json过程中的datetime转化问题。

实战任务

本次因为服务架构重构,表优化、重构,带来的任务就是需要从原来的mysql数据库中,读取原表数据(部分存在多张关联查询)然后通过调用API的服务方式灌入新的数据库表中(包含mysql、mongodb)。

执行流程如下

那么根据流程所需要的功能,需要以下的实例进行支撑: 1.并发实例 2.查询数据实例 3.执行post请求实例

目标:解决datetime序列化json问题

问题现象

代码语言:javascript
复制
TypeError: datetime.datetime(2018, 11, 27, 16, 0, 21) is not JSON serializable

解决方法

代码语言:javascript
复制
import datetime

    ## 转化datetime类型为str类型
    print type(api_body["lastModifyTime"].strftime("%Y-%m-%d %H:%M:%S"))
  
    ## 判断是否datetime类型
    if isinstance(api_body["lastModifyTime"],datetime.datetime):
        print "datetime类型"

    if isinstance(api_body["userId"],datetime.datetime):
        print "datetime类型"
    else:
        print "不是datetime类型"

只要有了上面的两个方法,就可以在body循环的过程中转化datetime格式为string类型了。

执行效果如下:

代码语言:javascript
复制
<type 'str'>
datetime类型
不是datetime类型

编写model增加body序列化为json格式的方法

首先将datetime类型的数据转化为str类型,然后直接调用json转格式即可。

代码语言:javascript
复制
    # 根据查询的结果以及字段字典,转化为请求API的body
    def convertApiBody(self,result,dict_fields):
        # 循环生成每条查询数据的请求body
        body = {}
        for result in result:
            for field in result:
                if field == "null":
                    body[field] = None
                else:
                    body[field] = result[field]
        # 更新body的字段为新表的字段
        new_body = {}
        for key, value in dict_fields.items():
            # print "key = %s , value = %s" % (key, value)
            if key == "null":
                new_body[value] = None
            elif isinstance(body[key],datetime.datetime): # 将datetime类型转str,解决json的序列化问题
                new_body[value] = body[key].strftime("%Y-%m-%d %H:%M:%S")
            else:
                new_body[value] = body[key]
        return new_body

调用执行一个post请求看看:

好了,插入成功了。

在这上面的过程,只插入了一条数据,真正的场景中是需要循环插入数据的,那么把执行post请求的方法进行循环执行。

下一个篇章,来看看循环执行以及如何并发处理请求。

下一篇
举报
领券