【问题标题】:How to remove built-in kinds' names in google datastore using kind queries如何使用种类查询删除谷歌数据存储中的内置种类名称
【发布时间】:2017-02-21 22:55:20
【问题描述】:

我正在尝试使用google cloud datastore 种类查询来获取在Kind queries 中演示的种类名称列表,

query = client.query(kind='__kind__')
query.keys_only()

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

但代码会生成一些内置的种类名称,例如

['_AE_DatastoreAdmin_Operation', '_GAE_MR_TaskPayload',
 '__Stat_Kind_IsRootEntity__', '__Stat_Kind_NotRootEntity__',
 '__Stat_Kind__', '__Stat_PropertyName_Kind__', 
 '__Stat_PropertyType_Kind__', '__Stat_PropertyType_PropertyName_Kind__',
 '__Stat_PropertyType__', '__Stat_Total__'] 

我想知道如何删除这些内置种类名称并仅保留用户创建的种类名称。

【问题讨论】:

    标签: python-3.x google-app-engine google-cloud-datastore


    【解决方案1】:

    这些似乎是在本地开发服务器/模拟器上创建的各种真实实体 - 它们实际上可以在数据存储查看器中看到。例如,__Stat_* 是在本地开发服务器上执行数据存储 Generate Stats 操作时创建的。

    这些实体不存在于项目的实时云数据存储中(或者它们存储在其他地方)。

    使用应用程序实体类型的简单命名规则 - 不以 _ 字符开头 - 您可以获得 kinds 列表,如下所示:

    kinds = [entity.key.id_or_name for entity in query.fetch()
                 if not entity.key.id_or_name.startswith('_')]
    

    根据 kinds 的使用,另一种选择 - 从编码角度来看更安全的恕我直言 - 可能始终根据明确的预期列表检查种类名称(例如,当清除所有 kinds实体):

    kinds = [entity.key.id_or_name for entity in query.fetch()
                 if entity.key.id_or_name in known_kinds_list]
    

    【讨论】:

    • 感谢您的解决方案。对于第二个解决方案,在我的场景中,我想创建一个 get_tables 方法,它返回所有用户创建的种类名称。对于pymongo.database.Database,它相当于collection_names。如果我有known_kinds_list,我可能不需要获取各种名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多