Google Datastore获取指定命名空间下所有Kind列表报错如何解决
问题根因
报错由默认根namespace的元数据类型特性导致:
- 查询
__namespace__元数据返回的结果中,代表默认(空)namespace的实体键ID为整数类型的1 datastore.Client构造方法的namespace参数仅支持传入字符串类型,直接把int类型的1传入就触发了类型不匹配报错。
修复方案
在遍历namespace的时候做一层值转换即可,不需要修改其他逻辑,调整后的循环代码如下:
for namespace in all_namespaces: print(f"====Processing namespace {namespace}====") # 处理默认namespace的特殊值 process_namespace = "" if namespace == 1 else str(namespace) client = datastore.Client(namespace=process_namespace) query = client.query(kind="__kind__") query.keys_only() kinds = [entity.key.id_or_name for entity in query.fetch()] # 根namespace在CSV中标记为(default)更易识别 kinds.insert(0, process_namespace if process_namespace else "(default)") namespaces_list_with_kinds.append(kinds)
额外优化建议
不需要每次循环都新建Datastore客户端实例,可以直接给查询指定namespace参数,运行效率更高:
# 全局仅初始化一次客户端即可 client = datastore.Client() for namespace in all_namespaces: print(f"====Processing namespace {namespace}====") process_namespace = "" if namespace == 1 else str(namespace) # 直接为查询指定namespace,复用客户端 query = client.query(kind="__kind__", namespace=process_namespace) query.keys_only() kinds = [entity.key.id_or_name for entity in query.fetch()] kinds.insert(0, process_namespace if process_namespace else "(default)") namespaces_list_with_kinds.append(kinds)
内容的提问来源于stack exchange,提问作者Vishal Bhatane
相关产品推荐
相关产品推荐

