文章目录
- 前言
- 一、查询SQL语句中数据转换
- 1、思路
- 2、示例
- 3、常用格式化模式
- 4、注意事项
- 二、自定义JSONEncoder处理
- 1、思路
- 2、示例
- 3、使用方法
- 写在结尾
前言
使用Python
开发查询PostgreSQL
数据库,返回数据中有timestamp
类型数据字段。如果使用json.dumps
转换成json
对象,可能会遇到:“TypeError: Object of type datetime is not JSON serializable
”错误,大概意思是datetime.datetime不可JSON序列化。
数据库字段定义:
"file_date" timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP
使用print将查询后元组中的值打印出来,发现timestamp类型的数据是以对象的形式存在的,如:datetime.datetime(2025, 6, 24, 11, 45, 36, 11746)
。
本文尝试在不改动数据库的情况下记录几种解决方法。
一、查询SQL语句中数据转换
1、思路
从数据源头处理,PostgreSQL
中直接查询timestamp
类型数据到元组中表现为对象,那就从查询语句着手,在查询的SQL
语句中将数据转换成字符串格式数据。
在PostgreSQL
中,可以使用TO_CHAR
函数将日期格式化为多种不同的格式。TO_CHAR
函数接受两个参数:一个是要格式化的日期值,另一个是定义输出格式的模板。
2、示例
SELECT TO_CHAR("file_date", 'YYYY-MM-DD HH24:MI:SS');
上述示例将当前时间格式化为 YYYY-MM-DD HH24:MI:SS
格式。
3、常用格式化模式
YYYY
:四位数年份MM
:两位数月份(01-12)DD
:两位数日期(01-31)HH24
:24小时制的小时(00-23)MI
:分钟(00-59)SS
:秒(00-59)
4、注意事项
- 日期插入:推荐使用
ISO
格式YYYY-MM-DD
插入日期值。 - 错误处理:如果插入的日期格式不正确,可能会导致错误。例如,‘16-10-2022’ 会导致错误,因为数据库无法确定哪个字段是日期,哪个字段是月份。
- 通过使用
TO_CHAR
函数和适当的格式化模式,可以灵活地在PostgreSQL
中处理和显示日期。
二、自定义JSONEncoder处理
1、思路
通过Python
中的json
模块。json.dumps()
是一个把Python
对象转换成json
字符串的函数。如下:
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,allow_nan=True, cls=None, indent=None, separators=None,default=None, sort_keys=False, **kw)
其中的cls
参数允许自定义JSONEncoder
的派生类,覆盖其中的default()
方法实现序列化其他类型的数据。
2、示例
from datetime import datetime
import jsonclass DateTimeEncoder(json.JSONEncoder):def default(self, o):if isinstance(o, datetime):return o.isoformat()return super().default(o)
3、使用方法
data = (1, 'c7ffc2fc7e9182e649e3cae0d9e8bf98', 0, datetime.datetime(2025, 6, 24, 11, 45, 36, 11746), None)
json.dumps(data, ensure_ascii=False, cls=DateTimeEncoder)
写在结尾
疑云盘诘久徘徊,忽见天光破雾来。解惑明心皆朗彻,故有此文以记之!