GridDB Python客户端插入带时区datetime至TIMESTAMP列报错及格式要求咨询
GridDB Python客户端TIMESTAMP列插入带时区datetime报错问题解答
结论
GridDB Python客户端要求TIMESTAMP类型的输入必须是无时区信息的naive datetime,或转换为UTC时区的datetime对象,客户端序列化层目前不直接支持带非UTC时区信息的datetime对象。
原因说明
GridDB的TIMESTAMP类型底层存储的是UTC时间戳,Python客户端在处理带时区的datetime时,仅能正确识别UTC时区的对象。对于其他时区的带tzinfo的datetime,由于序列化逻辑不兼容,会抛出GSException: [140001] Row format error错误。
有效解决方案
以下几种方式均可解决插入报错问题:
- 转换为无时区的naive datetime(需确保该时间基于业务约定的基准时区,避免时间偏差)
from datetime import datetime import pytz container = store.get_container("events_ts") ts = datetime.now(pytz.timezone("Asia/Kolkata")).replace(tzinfo=None) container.put((ts, "login")) - 转换为UTC时区的datetime对象
from datetime import datetime import pytz container = store.get_container("events_ts") ts = datetime.now(pytz.timezone("Asia/Kolkata")).astimezone(pytz.UTC) container.put((ts, "login")) - 直接构造UTC时间(适用于业务允许以UTC作为基准时间的场景)
from datetime import datetime import pytz container = store.get_container("events_ts") ts = datetime.utcnow().replace(tzinfo=pytz.UTC) container.put((ts, "login"))
补充验证
你已尝试的设置tzinfo=None和插入前转换为UTC操作均为有效解决方式,这也印证了客户端对TIMESTAMP输入的格式限制。该行为在GridDB CE和GridDB Cloud版本中一致,属于客户端序列化层的既定限制。
内容的提问来源于stack exchange,提问作者Klc
相关产品推荐
相关产品推荐

