python-3.x - 我们如何从谷歌数据存储中的特定命名空间中获取所有种类的列表?
问题描述
根据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
有人可以帮忙吗,谢谢。
解决方案
如果您希望自己获取种类名称,您可能应该使用 stats 实体。值得注意的是,__Stat_Ns_Kind__
应该有您正在寻找的数据。
至于您当前的问题,我猜有一些名称空间键被解释为数字。您可以通过在循环中打印名称空间的值和类型来调试它。
推荐阅读
- mysql - 使用group by时如何在MYSQL中重叠NULL值?
- rest - 未知 SeaweedFs Filer API 响应格式
- sql - 为 Redshift SQL 中两个不同列的日期之间的每一天创建一个新行
- c# - 避免在 CosmosDB 中使用 UpsertAsync - 运行更新 SQL 命令
- mysql - MySQL 删除唯一键:在外键约束中需要
- tizen - 如何从 tizen 上的另一个应用程序访问 data_control_h 句柄?
- python-2.7 - 并行python没有发现工作节点
- python-3.x - 无法在 Google Colab 中降级 scipy 包
- django - Django 过滤器 - 根据 url 中的 slug 编辑查询集
- regex - 如何在 Nginx 中拒绝除一个之外的所有 URI?