Google App Engine Datastore .put() 和 .get() 方法无法使用?
我正在尝试从数据存储中的一个表里选择一个实体,获取一些信息,然后把这些信息放到另一个表的实体里。不过,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 个回答
3
你的错误是因为 run
这个方法会执行查询,返回一个可以遍历的结果集,你需要逐个查看这些结果。它并不会直接返回一个实体。
在你的情况下,你试图更新这个结果集本身,然后再调用 put()
,这当然会失败。
即使你限制结果为1,你也需要逐个遍历。
你应该使用 get
方法,不过你提到你遇到了错误:
error: raise BadValueError('Property %s is required' % self.name) BadValueError: Property info is required
这是因为你在模型的属性 info
中做了更改,并添加了 required=True
,但你的数据存储中有一些旧数据没有 info
的值。
你的问题主要是因为你尝试或更改了太多东西,而没有真正理解发生了什么。我建议你回去看看查询和相关方法的文档,并在你的模型中暂时去掉 info
属性的 required=True
,直到你能更新所有实体,使得 info
有一个值。