python - 在事务中插入两个条目并得到 'Cannot operate on different entity groups in a transaction' 错误

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

我的最终目标很简单。我需要一个实体,它有两个唯一的索引字段,可以像键一样操作。如果这是一个 SQL 数据库,则等效项将具有两个定义为唯一且彼此独立的字段。我知道这个功能对于一个数据存储 db.Model 是不可能直接实现的,所以我不得不创建一个模仿这种行为的父子模型场景。

为了解决这个问题,我创建了两个模型(ParentEntity 和 ChildEntity)。ParentEntity 模型是一个dummy db.Model,它存储两个键的两个值,但只存储其中一个keys 被分配给模型 #1 的 key_name 参数。

创建父实体后,我创建了第二个子实体,方法是将第二个键指定为 key_name 并将我刚刚创建的父实体指定给子实体 parent 新 ChildEntity 对象的构造函数中的参数。

我的假设是,这会将这些实体保留在同一个实体组中,因为这是谷歌文档所暗示的。

我已将名为 InsertData 的插入方法添加到 ParentEntity(可以很容易地放置在 ChildEntity 中),我可以调用它来控制此插入逻辑并尝试通过以下方式插入这些记录一笔交易。

当我调用 InsertData 时,出现以下错误:

Cannot operate on different entity groups in a transaction: (kind='ChildEntity', name='key_name > 2') and (kind='ParentEntity', name='key_name 1').

如果我的第二个 (ChildEntity) 实体被分配给第一个实体 (ParentEntity) 到 parent 参数,这两个实体不应该在同一个实体组中吗?

所提供的代码是我正在努力实现的功能的副本。唯一的区别是一些额外的属性存储在 ChildEntity 中,一些数据验证发生在 txn() 定义之前,并且我已经将字段的名称更改为对这个问题更有意义的名称。

class ParentEntity(db.Model):
    str1_key =  db.StringProperty()
    str2 =      db.StringProperty()

    @staticmethod
    def InsertData(string1, string2, string3):
        try:
            def txn():
                #create first entity
                prt = ParentEntity(
                    key_name=string1, 
                    str1_key=string1, 
                    str2=string2)
                prt.put()

                #create User Account Entity
                    child = ChildEntity(
                    key_name=string2, 
                    parent=prt, 
                    str1=string1, 
                    str2_key=string2,
                    str3=string3,)
                child.put()
                return child
            db.run_in_transaction(txn)
        except Exception, e:
            raise e

class ChildEntity(db.Model):
    #foreign and primary key values
    str1 =      db.StringProperty()
    str2_key =  db.StringProperty()

    #pertinent data below
    str3 =      db.StringProperty()

最佳答案

我已经解决了这个问题,但解决方案与上述设置无关。如前所述,我的实际类在 InsertData 方法中包含一些验证代码。部分验证逻辑发生在 txn() 方法中。我认为这不会成为问题,因为我所做的所有验证都是检查以确保某些参数中存在文本值,并且某个特定参数具有一定长度。

在我将验证从 txn() 方法中移出后,插入操作就没有问题了。太棒了!

关于python - 在事务中插入两个条目并得到 'Cannot operate on different entity groups in a transaction' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6550029/

相关文章:

python - wxPython 弹出通知

Python:获取最后一小时的日期时间

python - 在 for 循环中使用时,pytorch 数据集对象如何知道它是否已到达末尾?

java - 使用 Deuce STM 进行队列

c# - NHibernate事务提交,什么会提交到数据库?

ruby-on-rails - 有没有办法将 after_commit 回调设置为特定的 ActiveRecord 事务

python - Sqlite/SQLAlchemy : how to enforce Foreign Keys?

python - 500 内部服务器错误 - GCP App Engine

google-app-engine - 使用 Google Cloud Logging (Python) 访问 GAE 日志文件

java - 新的 Google App Engine 数据存储 API 似乎没有抛出那么多异常?