GAE交易替代方案克服实体组限制5

时间:2014-07-20 19:25:17

标签: python google-app-engine transactions google-cloud-datastore app-engine-ndb

是否有其他方式/策略可用于实现与提供的相同" transaction"在GAE Python中? 在GAE,"交易"有助于确保事务中的所有NDB操作成功或全部回滚 我不能使用" transaction"由于实体组计数限制为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 

当我创建Model" A"的新实体(例如" A1")时,我也创建实体(例如," B1",&# 34; C1",D1"," E1"," F1"," G1")模型" B", " C"," D"," E"," F"," G"在同一个用户请求中。 我不想为实体分配父母" B1"," C1",D1"," E1"," F1" ," G1"。如果我将它们分配给父母(作为" A1"),那么我必须先得到" A1"每当我想得到任何" B1"," C1",D1"," E1"," F1",&# 34; G1&#34 ;.这是因为我们需要在" get_by_id"中指定祖先键。

1 个答案:

答案 0 :(得分: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'))

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

  

您可以将数据存储区查询过滤到指定的祖先,以便这样做   返回的结果将仅包括来自该实体的实体   祖先

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

Google Appengine NDB ancestor vs key query