Google App Engine Datastore .put() 和 .get() 方法无法使用?

0 投票
1 回答
1029 浏览
提问于 2025-04-18 05:19

我正在尝试从数据存储中的一个表里选择一个实体,获取一些信息,然后把这些信息放到另一个表的实体里。不过,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 有一个值。

撰写回答