使用Datastore API报错Expected a message object原因排查
问题描述
参考Datastore API官方文档编写Python操作代码,具体实现如下:
from google.cloud import datastore class DatastoreConf: def __init__(self): self.datastore_client = datastore.Client() def insert_entity(self): complete_key = self.datastore_client.key("Task", "sampleTask") task = datastore.Entity(key=complete_key) task.update( { "category": "Personal", "done": False, "priority": 4, "description": "Learn Cloud Datastore", } ) self.datastore_client.put(task) d = DatastoreConf() d.insert_entity()
已正确配置GOOGLE_APPLICATION_CREDENTIALS环境变量指向服务账号密钥,所用账号具备足够操作权限,运行时抛出错误:TypeError: Expected a message object, but got kind: "Task" name: "sampleTask"
完整报错追踪栈:
Traceback (most recent call last): File "C:/Users/user/project/datastore_configuration.py", line 24, in <module> d.get_entity() File "C:/Users/user/project/datastore_configuration.py", line 21, in get_entity self.datastore_client.put(task) File "C:\Users\user\project\venv\lib\site-packages\google\cloud\datastore\client.py", line 575, in put self.put_multi(entities=[entity], retry=retry, timeout=timeout) File "C:\Users\user\projectvenv\lib\site-packages\google\cloud\datastore\client.py", line 612, in put_multi current.put(entity) File "C:\Users\user\project\venv\lib\site-packages\google\cloud\datastore\batch.py", line 227, in put _assign_entity_to_pb(entity_pb, entity) File "C:\Users\user\project\venv\lib\site-packages\google\cloud\datastore\batch.py", line 373, in _assign_entity_to_pb bare_entity_pb = helpers.entity_to_protobuf(entity) File "C:\Users\user\project\venv\lib\site-packages\google\cloud\datastore\helpers.py", line 207, in entity_to_protobuf key_pb = entity.key.to_protobuf() File "C:\Users\user\project\venv\lib\site-packages\google\cloud\datastore\key.py", line 298, in to_protobuf key.path.append(element)
错误原因
依赖版本不兼容。当前环境中google-cloud-datastore和其依赖的protobuf、google-api-core版本不匹配,Key对象序列化为protobuf格式时,路径元素没有被正确封装为要求的PathElement消息实例,直接传入了原始键属性对象,触发protobuf类型校验错误。
常见触发场景:
- 单独升级
google-cloud-datastore时未同步更新关联依赖 - 虚拟环境内其他谷歌云相关库强制安装了不兼容的低版本protobuf或google-api-core
修复方案
- 卸载当前存在冲突的相关包:
pip uninstall -y google-cloud-datastore protobuf google-api-core
- 重新安装稳定版
google-cloud-datastore,安装过程会自动拉取版本匹配的依赖:
pip install google-cloud-datastore
- 若需要固定版本避免后续冲突,可使用经过兼容性验证的版本组合:
google-cloud-datastore==2.15.2+protobuf>=3.19.5,<5.0.0dev - 安装完成后执行
pip list | grep -E "google-cloud-datastore|protobuf|google-api-core"校验版本,确认无版本冲突后重新运行代码即可。
内容的提问来源于stack exchange,提问作者crowlek
相关产品推荐
相关产品推荐

