Python2从PostgreSQL取数生成XML:datetime序列化报错及转换咨询
解决Python2中ElementTree无法序列化datetime到XML的问题
这个问题我之前在处理数据库导出XML的时候也碰到过——ElementTree的元素text属性只接受字符串类型,而你从PostgreSQL用fetchall()拿到的row[7]、row[8]这些是datetime.datetime对象,直接赋值自然会抛出Cannot serialize datetime...的错误。
给你两个实用的解决办法:
方法1:直接转成字符串(简单快速)
如果对日期格式没有特殊要求,直接用str()函数把datetime对象转成字符串就行:
for row in rows: Jobs = ET.SubElement(JobList, 'Jobs') # ... 其他代码 ... scheduledTime.text = str(row[7]) startTime.text = str(row[8]) endTime.text = str(row[9]) # ... 其他代码 ... myJobList = ET.tostring(JobList)
这种方式会输出类似2018-02-04 23:05:00的格式,和PostgreSQL默认的datetime字符串格式一致。
方法2:自定义日期格式(更灵活)
如果需要指定XML里的日期格式(比如符合ISO 8601标准,或者其他业务要求的格式),用datetime对象的strftime()方法来生成自定义字符串:
for row in rows: Jobs = ET.SubElement(JobList, 'Jobs') # ... 其他代码 ... # 转成YYYY-MM-DD HH:MM:SS格式 scheduledTime.text = row[7].strftime("%Y-%m-%d %H:%M:%S") startTime.text = row[8].strftime("%Y-%m-%d %H:%M:%S") endTime.text = row[9].strftime("%Y-%m-%d %H:%M:%S") # ... 其他代码 ... myJobList = ET.tostring(JobList)
你可以根据需求修改strftime的格式参数,比如要带毫秒就用%Y-%m-%d %H:%M:%S.%f,要转成特定时区格式也可以结合datetime的时区方法处理。
本质上就是要把数据库返回的datetime对象显式转换为字符串,这样ElementTree才能正常序列化到XML中。
内容的提问来源于stack exchange,提问作者Micolho
相关产品推荐
相关产品推荐

