GridDB Python客户端修改容器Schema后出现陈旧元数据问题咨询
GridDB Python客户端Schema修改后元数据缓存问题
问题背景
使用GridDB Cloud及Python客户端(griddb_python),在启用修改标志调用put_container()修改现有容器定义后,遇到Schema不一致导致的行格式错误问题。
初始Schema
import griddb_python as griddb conInfo = griddb.ContainerInfo( name="devices", column_info_list=[ ("id", griddb.Type.INTEGER), ("name", griddb.Type.STRING) ], type=griddb.ContainerType.COLLECTION, row_key=True ) store.put_container(conInfo, True)
修改Schema
添加新列status后重新调用put_container:
updated = griddb.ContainerInfo( name="devices", column_info_list=[ ("id", griddb.Type.INTEGER), ("name", griddb.Type.STRING), ("status", griddb.Type.STRING) ], type=griddb.ContainerType.COLLECTION, row_key=True ) store.put_container(updated, True)
观察到的异常行为
Schema更新后立即执行以下代码:
container = store.get_container("devices") container.put((1, "router", "active"))
有时会抛出错误:
GSException: [140001] Row format error
同时存在以下特征:
- 重新创建Store连接可解决问题
- 等待数秒后自动恢复
- 现有行仍可正常读取
- 仅重新获取容器对象并不总能解决问题
已验证的情况
- 在GridDB CE和GridDB Cloud中均可复现该问题
- 无并发Schema更新操作
- 仅在修改容器Schema后立即出现该问题
- 重启客户端会话可一致解决问题
核心问题
GridDB Python客户端是否会在Store会话级别缓存容器Schema元数据,导致调用put_container(..., True)修改现有Schema后需要重新连接或刷新元数据?
环境信息
- GridDB Cloud
- Python 3.10
- griddb_python v5.x
- COLLECTION容器
解答
是的,GridDB Python客户端确实会在Store会话级别缓存容器的Schema元数据。当你调用put_container(..., True)修改容器Schema时,服务端的Schema会立即更新,但当前Store会话的本地缓存仍然保留着旧的元数据。此时即使调用get_container()获取容器,客户端可能直接返回缓存的容器实例,而非从服务端拉取最新的Schema,导致插入新格式数据时出现行格式不匹配的错误。
可行的解决方案
- 重新创建Store连接:这是最可靠的方式,新连接会从服务端拉取最新的容器元数据,彻底避免缓存问题。
- 强制刷新元数据:调用
get_container时传入第二个参数True,强制客户端从服务端重新获取容器的最新Schema,而非使用缓存:container = store.get_container("devices", True) - 等待缓存过期:客户端缓存会在一段时间后自动失效,但这个时长不可控,不推荐作为生产环境的解决方案。
内容的提问来源于stack exchange,提问作者Klc
相关产品推荐
相关产品推荐

