【发布时间】: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