Google app engine 是否可能在同一实体组中有db模型和ndb模型?

Google app engine 是否可能在同一实体组中有db模型和ndb模型?,google-app-engine,app-engine-ndb,Google App Engine,App Engine Ndb,我们有一个db模型,Vote,我们已经使用了一段时间,最近添加了一个ndb模型,Score,它代表一个实体基于其投票的累积分数。目前,Score是其投票的父项,因为我们希望所有投票都在同一实体组中(这样它们可以在同一事务中更新)。我一直在尝试让一个事务正常工作,它将更新投票和分数,但始终失败。下面是一些示例代码: def transaction(): score = self.key_score.get() vote = db.get(self.key_v

我们有一个db模型,
Vote
,我们已经使用了一段时间,最近添加了一个ndb模型,
Score
,它代表一个实体基于其投票的累积分数。目前,
Score
是其投票的父项,因为我们希望所有投票都在同一实体组中(这样它们可以在同一事务中更新)。我一直在尝试让一个事务正常工作,它将更新
投票
分数
,但始终失败。下面是一些示例代码:

    def transaction():
        score = self.key_score.get()
        vote = db.get(self.key_vote)

        # do stuff

        score.put()
        vote.put()
    db.run_in_transaction(transaction)
据我所知(仅适用于开发服务器),此操作始终会重试四次:

WARNING:root:Transaction collision. Retrying...
WARNING:root:Transaction collision. Retrying...
WARNING:root:Transaction collision. Retrying...
WARNING:root:Transaction collision. Retrying...
ERROR
然后我得到“TransactionFailedError:无法提交事务。请重试。”

我尝试了一些方法来解决这个问题:

  • 更改get和put的顺序-我想可能有一个实体组锁定问题,我不理解,但是更改get或put的顺序并没有改变行为

  • 异步放置。这实际上是我开始的——我所知道的同时放置db和ndb模型的唯一方法(我认为这基本上就是在幕后放置多个键所做的)。同样的结果

    score_future = score.put_async()
    vote_future = db.put_async(vote)
    score_future.get_result()
    vote_future.get_result()
    
  • ndb.transaction
    替换事务中的
    db.run\u。这会在
    db.get
    上抛出“AttributeError:'Key'对象没有属性'reference'”。我不确定这里发生了什么-看起来一些幕后代码正在得到它期望的
    ndb.Key

  • 有趣的是,如果我删除
    父关系,我可以运行与上面相同的代码,这意味着实体不在同一个实体组中


    那么,是否可能在同一实体组中同时拥有db和ndb模型?也许有一种简单的方法可以将db模型作为ndb来获取,反之亦然?

    所有实体在数据存储中看起来都是一样的,不管它们是用db还是ndb创建的。这里的问题是,您试图在一个API调用中混合使用这两者;当传递ndb模型实例时,db不知道该做什么

    您需要创建一个与投票db模型相同的NDB模型——或者更好的是,将投票迁移到NDB模型——并在需要两种实体类型的事务的任何代码中使用该模型