【发布时间】:2014-07-20 19:25:17
【问题描述】:
是否有替代方法/策略可用于实现与 GAE Python 中提供的“transaction”相同的效果?
在 GAE 中,“事务”有助于确保事务中的所有 NDB 操作都成功或全部回滚。
由于实体组计数限制为 5(xg),我无法在我认为需要它的代码中的许多地方使用“事务”。
珍惜你的时间。
使用案例之一
class A(ndb.Model):
:: # Some Properties
class B(ndb.Model):
:: # Some Properties
class C(ndb.Model):
:: # Some Properties
class D(ndb.Model):
:: # Some Properties
class E(ndb.Model):
:: # Some Properties
class F(ndb.Model):
:: # Some Properties
class G(ndb.Model):
:: # Some Properties
class create_new_x (BaseRequestHandler):
@ndb.toplevel
def get(self):
::
a1 = A (id="x", p1=v1, .. , pn=vn)
a1.put_async ()
b1 = B (id="y", p1=v1, .. , pn=vn)
b1.put_async ()
::
g1 = G (id="z", p1=v1, .. , pn=vn)
g1.put_async ()
return
当我创建模型“A”的新实体(例如,“A1”)时,我还会创建实体(例如,“B1”、“C1”、D1”、“E1”、“F1”、“G1” ") 在同一用户请求中的型号“B”、“C”、“D”、“E”、“F”、“G”。 我不想为实体“B1”、“C1”、D1”、“E1”、“F1”、“G1”分配父级。如果我将它们分配为父级(如“A1”),那么我将不得不每当我想获得“B1”、“C1”、D1”、“E1”、“F1”、“G1”中的任何一个时,首先获得“A1”。这是因为我们需要在“get_by_id”中指定祖先键。
【问题讨论】:
-
我猜这是因为您的问题非常广泛,任何建议都必须针对您的实施。代码示例很有帮助。
-
@user3058197 感谢您提供帮助。我已经用更多信息更新了这个问题。我在我的代码中添加了一个类似的例子。
-
如果您使用指定的键创建父模型,您可以在 get_by_id 中使用它(手动构建键)作为父模型,而无需实际检索它。它甚至不必存在就可以像那样使用。
-
@PaulCollingwood 这听起来像是解决问题的好方法。谢谢你的帮助。您还提到:
It does not even have to exist for it to be used like that.您的意思是说用于创建实体的密钥可能是假的(根本不是任何实体的密钥,而是使用 id 简单地创建的)?请添加您的建议作为答案,以便我接受。
标签: python google-app-engine transactions google-cloud-datastore app-engine-ndb