首页 > 解决方案 > 我们如何从谷歌数据存储中的特定命名空间中获取所有种类的列表?

问题描述

根据https://cloud.google.com/datastore/docs/concepts/metadataqueries

种类查询返回种类种类的实体,其键名是实体种类的名称。这种类型的查询被隐式地限制在当前命名空间中,并且仅支持对伪属性上的范围进行过滤。结果可以按升序(但不是降序)键值排序。因为种类实体没有属性,所以仅键和非仅键查询都返回相同的信息。

我不确定当前命名空间是什么意思,如何设置当前命名空间?在创建客户端对象时传递命名空间作为参数,在查询后给我错误。

代码 :

from os import name
from google.cloud import datastore
import csv

# For help authenticating your client, visit
# https://cloud.google.com/docs/authentication/getting-started
client = datastore.Client()

datstore_kinds_file = "datastore_kinds.csv"

# All namespaces
query = client.query(kind="__namespace__")
query.keys_only()

all_namespaces = [entity.key.id_or_name for entity in query.fetch()]

namespaces_list_with_kinds=[]

for namespace in all_namespaces:
    print(f"====Processing namespace {namespace}====")
    client = datastore.Client(namespace=namespace)
    query = client.query(kind="__kind__")
    query.keys_only()
    kinds = [entity.key.id_or_name for entity in query.fetch()]
    kinds.insert(0,namespace)
    namespaces_list_with_kinds.append(kinds)

# writing to csv file
with open(datstore_kinds_file, 'w') as csvfile:
    # creating a csv writer object
    csvwriter = csv.writer(csvfile)

    # writing the fields
    csvwriter.writerows(namespaces_list_with_kinds)

错误 :

Traceback (most recent call last):
  File "get_all_datastore_kinds.py", line 25, in <module>
    kinds = [entity.key.id_or_name for entity in query.fetch()]
  File "get_all_datastore_kinds.py", line 25, in <listcomp>
    kinds = [entity.key.id_or_name for entity in query.fetch()]
  File "/home/vishal/.local/lib/python3.8/site-packages/google/api_core/page_iterator.py", line 212, in _items_iter
    for page in self._page_iter(increment=False):
  File "/home/vishal/.local/lib/python3.8/site-packages/google/api_core/page_iterator.py", line 243, in _page_iter
    page = self._next_page()
  File "/home/vishal/.local/lib/python3.8/site-packages/google/cloud/datastore/query.py", line 566, in _next_page
    partition_id = entity_pb2.PartitionId(
TypeError: 1 has type int, but expected one of: bytes, unicode

有人可以帮忙吗,谢谢。

标签: python-3.xgoogle-apigoogle-cloud-storagegoogle-cloud-datastore

解决方案


如果您希望自己获取种类名称,您可能应该使用 stats 实体。值得注意的是,__Stat_Ns_Kind__应该有您正在寻找的数据。

至于您当前的问题,我猜有一些名称空间键被解释为数字。您可以通过在循环中打印名称空间的值和类型来调试它。


推荐阅读