Google app engine 是否可能在同一实体组中有db模型和ndb模型?
我们有一个db模型,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
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:无法提交事务。请重试。”
我尝试了一些方法来解决这个问题:
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模型——并在需要两种实体类型的事务的任何代码中使用该模型