在Python中使用GridDB的TIMESTAMP类型存储信用卡到期日遇问题
解决GridDB中TIMESTAMP类型存储信用卡到期日的问题
问题原因
GridDB的TIMESTAMP类型在Python API中无法直接接收原生datetime对象,需要转换为毫秒级时间戳整数,或通过工具类处理时区与格式匹配。
修正方案
方案1:手动转换为毫秒级时间戳
将Python datetime对象转为UTC时区后,计算从1970年epoch开始的毫秒数,直接传入容器:
import datetime # 构造UTC时区的到期日时间 expiration_date = datetime.datetime(2028, 12, 1, tzinfo=datetime.timezone.utc) # 转换为毫秒级时间戳 expiration_ts = int(expiration_date.timestamp() * 1000) # 定义容器结构 container_info = griddb.ContainerInfo("CreditCard", [["id", griddb.Type.INTEGER], ["cardNumber", griddb.Type.BLOB], ["expirationDate", griddb.Type.TIMESTAMP], ["ownerName", griddb.Type.STRING]], griddb.ContainerType.COLLECTION, True) # 获取实际容器实例(需先通过gridstore连接获取) container = gridstore.get_container("CreditCard") # 存入数据 container.put([cardId, encryptedCardNumber, expiration_ts, ownerName])
方案2:使用GridDB TimeUtil工具类(驱动版本支持时)
部分GridDB Python驱动提供了TimeUtil类,可直接转换datetime对象:
import datetime from griddb.time_util import TimeUtil # 构造UTC时区的到期日 expiration_date = datetime.datetime(2028, 12, 1, tzinfo=datetime.timezone.utc) # 转换为GridDB兼容的TIMESTAMP格式 expiration_ts = TimeUtil.datetime_to_timestamp(expiration_date) # 容器定义与数据存入操作同方案1
关键注意事项
- 时区必须统一:GridDB的TIMESTAMP默认存储UTC时间,若你的到期日是本地时间,需先转换为UTC:
local_date = datetime.datetime(2028, 12, 1) utc_date = local_date.astimezone(datetime.timezone.utc) - 容器实例获取:不能直接用
ContainerInfo对象调用put,必须通过GridStore连接实例的create_container或get_container获取实际容器对象。 - 旧容器清理:修改字段类型后,需删除原STRING类型的容器,重新创建新结构的容器,避免类型冲突。
内容的提问来源于stack exchange,提问作者Saif
相关产品推荐
相关产品推荐

