Google App Engine数据存储区.put()和.get()方法不起作用?

时间:2014-05-04 16:32:32

标签: python google-app-engine google-cloud-datastore

我尝试从数据存储区的一个表中选择一个实体,从中获取一些信息,然后将该信息放入另一个表中的实体中。 put()get()方法似乎无法正常工作,我无法弄清楚原因。

aName = 'Hello'
q = firstTable.all()
q.filter("date =", datetime.date.today())
dateInfo = q.get() # get method here works fine
p = db.GqlQuery("SELECT * FROM secondTable WHERE name = '%s'" % aName)
result = p.run(limit = 1) # here, there's an error if I use get(), but no error if I use run()

result.firstProperty = dateInfo.firstProperty
result.secondProperty = dateInfo.secondProperty

result.put() # this line does not work
  • 知道这里有什么不对吗?
  • 实体本身的问题会导致此行为吗?
  • 特别令我感到困惑的是,.run()方法适用于p,但.get()不起作用。 什么可能导致这种情况?

日志中的错误消息:

'_QueryIterator' object has no attribute 'put' Traceback (most recent call last): File "/base/data/home/runtimes/python27/python27_lib/versions/thir

我知道某些行不起作用的方式是,当我注释掉那些特定的行时,页面会加载并且不会抛出上述错误。

如果我尝试使用.get()代替.run(),则会出现此错误:

raise BadValueError('Property %s is required' % self.name)
BadValueError: Property info is required

1 个答案:

答案 0 :(得分:3)

您的错误是因为run导致查询运行,返回迭代器,您需要迭代结果。它不会直接返回实体。

在你的情况下,你试图更新迭代器本身,然后调用当然失败的put()

即使限制为1,您也需要进行迭代。

你应该使用get,但是,你指出你收到错误:

error: raise BadValueError('Property %s is required' % self.name) BadValueError: Property info is required

这是因为您更改了模型info中的属性并添加了required=True,但您在数据存储区中有一些旧数据没有info的值。

你的问题与一次尝试/改变太多事情有很大关系而没有真正了解正在发生的事情。我建议您返回并阅读有关查询及其方法的文档,并从模型中的required=True属性中删除info,直到您可以更新所有实体,以便info有价值。