1

我已经收集了数据,它不是特别干净的数据,并且已经批量上传到 DataStore。但是,当尝试简单地遍历所有记录时,我遇到了以下问题。此时我不太关心验证,因为我想做的只是执行批量操作,但 GAE 似乎甚至不允许我遍历数据记录。我想深入了解这一点。据我所知,所有记录都有该国家/地区的现场数据,我可以切换验证,但有人可以解释为什么会发生这种情况并且 GAE 很敏感。谢谢

result = Company.all()
        my_count = result.count()
        if result:
            for r in result:
                self.response.out.write("hello")

数据模型具有以下属性:

class Company(db.Model):
    companyurl = db.LinkProperty(required=True)
    companyname = db.StringProperty(required=True)
    companydesc = db.TextProperty(required=True)
    companyaddress = db.PostalAddressProperty(required=False)
    companypostcode = db.StringProperty(required=False)
    companyemail = db.EmailProperty(required=True)
    companycountry = db.StringProperty(required=True)

错误信息如下

Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py", line 701, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/XXX/1.358667163009710608/showcompanies.py", line 99, in get
    for r in result:
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 2312, in next
    return self.__model_class.from_entity(self.__iterator.next())
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 1441, in from_entity
    return cls(None, _from_entity=entity, **entity_values)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 973, in __init__
    prop.__set__(self, value)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 613, in __set__
    value = self.validate(value)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 2815, in validate
    value = super(StringProperty, self).validate(value)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 640, in validate
    raise BadValueError('Property %s is required' % self.name)
BadValueError: Property companycountry is required
4

1 回答 1

1

如果您有希望在其自己的脚本中运行的批量进程,您可以构建您的Company类的修改版本而无需验证。由于db.Model类只是基于类名称的数据存储的包装器,因此您可以在代码的不同部分拥有具有不同行为的不同类。

因此,您可能有一个 model.py 文件,其中包含:

class Company(db.Model):
  companyurl = db.LinkProperty(required=True)
  # ...
  companycountry = db.StringProperty(required=True)

# Normal operations go here

而且,另一个 bulk_process.py 文件包含:

class Company(db.Model):
  companyurl = db.LinkProperty()
  # ...
  companycountry = db.StringProperty()

result = Company.all()
my_count = result.count()
if result:
  for r in result:
    self.response.out.write("hello")

因为第二个模型类缺少验证,它应该运行得很好。而且,由于代码在逻辑上是分开的,您不必担心会因删除其余代码中的验证而产生意外的副作用。只需确保您的批量过程不会在未经验证的情况下意外写回数据(除非您对此表示满意)。

于 2012-05-04T20:47:28.733 回答