前情回顾
上一篇文章已经编写了mysql查询以及生成请求api的body数据,那么本章节我们来继续编写解决body序列化json过程中的datetime转化问题。
实战任务
本次因为服务架构重构,表优化、重构,带来的任务就是需要从原来的mysql数据库中,读取原表数据(部分存在多张关联查询)然后通过调用API的服务方式灌入新的数据库表中(包含mysql、mongodb)。
执行流程如下
那么根据流程所需要的功能,需要以下的实例进行支撑: 1.并发实例 2.查询数据实例 3.执行post请求实例
目标:解决datetime序列化json问题
问题现象
TypeError: datetime.datetime(2018, 11, 27, 16, 0, 21) is not JSON serializable
解决方法
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类型了。
执行效果如下:
<type 'str'>
datetime类型
不是datetime类型
编写model增加body序列化为json格式的方法
首先将datetime类型的数据转化为str类型,然后直接调用json转格式即可。
# 根据查询的结果以及字段字典,转化为请求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请求的方法进行循环执行。
下一个篇章,来看看循环执行以及如何并发处理请求。