【问题标题】:GAE Transaction Alternatives to overcome entity group limit of 5克服实体组限制的 GAE 交易替代方案 5
【发布时间】: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


【解决方案1】:

您可以通过手动构造键来检索实体,包括祖先路径:

rev_key = ndb.Key('Account', 'Sandy', 'Message', 'greeting', 'Revision', '2')
address = ndb.get(rev_key)

您也可以使用命名参数parent 直接指定祖先路径中的任何实体。

k2 = ndb.Key(Revision, '2', parent=ndb.Key('Account', 'Sandy', 'Message', 'greetings'))

链中的父级不必存在就可以以这种方式使用,但通常您会创建它(例如,作为设置的一部分,作者作为父级,书籍作为子级)。但如果它的名字可以提前确定,你就可以使用它。

您可以将 Datastore 查询过滤到指定的祖先,以便 返回的结果将仅包括从该实体派生的实体 祖先

https://developers.google.com/appengine/docs/python/ndb/entities

Google Appengine NDB ancestor vs key query

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2016-04-30
    • 2011-10-16
    • 1970-01-01
    • 2019-06-20
    相关资源
    最近更新 更多