如何配置PyMongo/MongoDB始终返回时区感知的datetime对象
全局配置PyMongo返回时区感知的datetime对象
当然有全局配置的方法,不用每次查询都手动指定CodecOptions!下面给你两种常用的全局配置方式,适配不同的使用场景:
1. 在创建MongoClient时全局设置
这是最彻底的方式,所有通过该Client获取的数据库、集合都会默认使用时区感知的编解码器:
from pymongo import MongoClient from pymongo.codec_options import CodecOptions # 定义全局的时区感知编解码选项 global_codec_options = CodecOptions(tz_aware=True) # 初始化MongoClient时传入该选项 client = MongoClient( 'mongodb://localhost:27017/', codec_options=global_codec_options ) # 后续获取的数据库、集合自动继承配置 db = client['your_target_db'] collection = db['your_target_collection'] # 查询返回的start_date会自动带UTC时区信息 sample_doc = collection.find_one({"start_date": {"$exists": True}}) print(sample_doc['start_date']) # 输出示例:datetime.datetime(2024, 5, 20, 14, 45, 30, tzinfo=datetime.timezone.utc)
2. 为已存在的数据库/集合单独配置
如果已经初始化了默认的MongoClient,也可以给特定数据库或集合单独设置默认编解码选项,覆盖全局默认值:
给数据库设置
from pymongo import MongoClient from pymongo.codec_options import CodecOptions client = MongoClient('mongodb://localhost:27017/') # 给指定数据库绑定时区感知配置 db = client.get_database( 'your_target_db', codec_options=CodecOptions(tz_aware=True) ) # 该数据库下的所有集合都会使用这个配置 collection = db['your_target_collection']
给集合设置
# 基于已有的数据库,给单个集合配置 collection = db.get_collection( 'your_target_collection', codec_options=CodecOptions(tz_aware=True) )
额外说明
- 设置后,所有从该Client/DB/Collection查询返回的
datetime对象都会自动携带UTC时区信息(tzinfo=datetime.timezone.utc),完全符合MongoDB中ISODate的存储格式。 - 你的PyMongo 3.9版本完全支持这个配置,和MongoDB 4.x服务器兼容性没问题。
内容的提问来源于stack exchange,提问作者pakobill
相关产品推荐
相关产品推荐

