在事务中插入两个实体&get'不能在事务中的不同实体组上操作'E

2024-10-04 01:30:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我的最终目标很简单。我需要一个实体,它有两个唯一的索引字段,可以像键一样操作。如果这是一个SQL数据库,那么等价物将有两个字段,它们都被定义为唯一的,并且彼此独立。我知道这个功能不可能直接用于一个数据存储数据库模型,所以我不得不创建一个模拟这种行为的父子模型场景。在

为了解决这个问题,我创建了两个模型(ParentEntity和ChildEntity)数据库模型它存储两个键的两个值,但只有一个键被分配给模型1的键名称参数。在

在创建父实体之后,我创建第二个子实体,方法是将第二个键指定为键名称,并将我刚刚创建的父实体分配给新ChildEntity对象构造函数中的child entitiesparent参数。在

我的假设是,这将使这些实体保持在同一个实体组中,因为这正是google文档所暗示的。在

我已经向ParentEntity添加了一个名为InsertData的插入方法(它可以很容易地放在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)实体被分配给parent参数的第一个实体(ParentEntity),这两个实体不应该在同一个实体组中吗?在

提供的代码是我试图实现的功能副本。唯一的区别是,在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()

Tags: keyname模型实体名称数据库childdb
1条回答
网友
1楼 · 发布于 2024-10-04 01:30:53

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

在我将验证从txn()方法中移走之后,插入操作就可以正常工作了。杰出的!在

相关问题 更多 >