【问题标题】:GAE: Cloud Datastore KindError when getting entity from keyGAE:从密钥获取实体时出现 Cloud Datastore KindError
【发布时间】:2020-04-11 20:06:04
【问题描述】:

我有一个使用 Datastore 在 GAE Python2.7 Standard 环境中运行的应用程序。

我们数据存储区的实体类型目前基于“appname_classname”(小写)的命名约定。

种类
- common_account(在“common”应用的 Account 类下)
- common_animal(在“常见”应用的 Animal 类下)

这个命名约定是由于框架(kay framework)的特性。 只要我使用的是 kay 框架,获取如下实体就没有错误。

from google.appengine.ext import db
from common.models import Animal
lst = [e for e in Animal.all()]
animal = lst[0]
db.get(str(animal.key()))

但这次我使用现有 Datastore 的数据基于 Flask 创建了一个新项目。 所以我从当前项目中导出了所有实体并将它们导入到一个新项目中。

我使用 __name__ 重命名了类。

from google.appengine.ext import db
class BaseModel(db.Model):
    created_at = db.DateTimeProperty(auto_now_add=True)
    updated_at = db.DateTimeProperty(auto_now=True)
    is_deleted = db.BooleanProperty(default=False)

class Animal(BaseModel):
    name = db.StringProperty()
    number = db.IntegerProperty()

Animal.__name__ == 'common_animal'

由于我将 Animal 类的名称更改为“common_animal”,因此我能够使用以下查询获取“common_animal”类型的实体。

lst = [e for e in Animal.all()]

但是当我尝试使用 db.get() 获取实体时,我得到了 KindError。为什么即使我将 Animal 类名称更改为“common_animal”,我也会收到 KindError。

from google.appengine.ext import db
from common.models import Animal
lst = [e for e in Animal().all().fetch(limit=100)]
animal = lst[0]
db.get(str(animal.key()))
KindError: No implementation for kind 'common_animal'

看起来错误来自 'google-cloud-sdk/platform/google_appengine/google/appengine/ext/db/init.py' 的 class_for_kind。 _kind_map 无法识别 __name__,它应该是 'common_animal'

pp _kind_map
{'Animal': <class 'common.models.Animal'>,
 'BaseModel': <class 'common.models.BaseModel'>,
 'Division': <class 'common.models.common_division'>,
 'Expando': <class 'google.appengine.ext.db.Expando'>,
 'Model': <class 'google.appengine.ext.db.Model'>,
 '__BlobMigration__': <class 'google.appengine.ext.blobstore.blobstore.BlobMigrationRecord'>}

【问题讨论】:

    标签: python-2.7 google-app-engine flask google-cloud-datastore app-engine-ndb


    【解决方案1】:

    您需要覆盖模型类的 kind() 方法,而不是设置 __name__。参考文档位于https://cloud.google.com/appengine/docs/standard/python/datastore/modelclass#Class_Methods

    NDB transition 文档隐约有一个例子。

    【讨论】:

    • 成功了。谢谢!!希望谷歌在文档中明确说明......
    • 嘿@steve,我注意到您正在使用用于python 2 的db 客户端库。我强烈建议您migrate to NDB library,因为该库提供了更多功能,例如自动缓存,更稳定和更好的支持.
    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多