googleappengine:从数据存储“刷新”模型的首选/惯用方式?

2024-09-29 23:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我观察到以下情况:(Odp是一个模型)

o = Odp.get(odpKey)
o.foo = 0
foo()
assert o.foo == 1 # fails

def foo():
    o = Odp.get(odpKey)
    o.foo += 1
    o.put()

o的底层数据存储表示更新时,它的第一个副本似乎没有刷新。那么,刷新它的首选方法是什么呢?在

我在想:

^{pr2}$

或者有更好的方法吗?在


Tags: 数据方法模型getfooputdef副本
1条回答
网友
1楼 · 发布于 2024-09-29 23:23:49

t looks like the first copy of o isn't refreshed when it's underlying datastore representation is updated.

正确:在执行函数foo的过程中,内存中有两个完全独立的对象,这两个对象碰巧都绑定到与o相等的裸名上,但这是一个不相关的细节(只是进一步混淆了事情;-)。在

o = Odp.get(odpKey)
o.foo = 0
foo()
o = Odp.get(o.key())
assert o.foo == 1 # win

“赢”只是第一次,因为o.foo = 0只影响一个从未放入数据库的拷贝,然后o会反弹到一个刚刚从数据库获得的第三个拷贝,那么o.foo将是1第一次时间(如果foo属性默认为0),但在随后的尝试中不是这样,因为它每次都会增加一个。在调用foo()之前,您需要一个o.put(),以使o.foo = 0赋值具有任何意义。在

一个更好的主意是让foo函数接受一个可选参数(有问题的对象),并且只有在它没有接收到该参数的情况下,才让它获得一个新的副本;然后在任何情况下,返回它正在处理的对象。听着,你应该:

^{pr2}$

您可以在某处添加一个o.put(),但通常最好是在一组相关的更改都应用于内存中的副本时保存。在一个内存副本上执行基本上所有的工作可以节省到数据库的大量往返,从而使应用程序的速度大大提高很多。在

相关问题 更多 >

    热门问题