如何为 GAE 数据存储数据模型创建两个唯一的可查询字段?

2023-12-22

首先进行一些设置。上周,我在实现我构建的一种特定方法时遇到了麻烦,该方法允许我管理与一个 db.Model 对象关联的两个唯一字段。由于这是不可能的,因此我创建了一个父实体类和一个子实体类,每个类都为 key_name 分配了一个唯一值。你可以找到我之前的问题位于这里 https://stackoverflow.com/questions/6550029/inserting-two-enties-in-a-transaction-getting-cannot-operate-on-different-enti,其中包括我的示例代码和我的插入过程的一般说明。

关于我最初的问题,有人评论说我的解决方案无法解决我需要与一个 db.Model 对象关联的两个唯一字段的问题。

我的实现尝试通过实现创建 ParentEntity 的静态方法来解决此问题,并将其 key_name 属性分配给我的唯一值之一。在流程的第二步中,我创建一个子实体并将父实体分配给父参数。这两个步骤都是在数据库事务中执行的,因此我认为这将强制唯一性约束起作用,因为我的两个值都存储在两个单独模型中的两个单独的 key_name 字段中。

评论者指出,此解决方案不起作用,因为当您将父实体设置为子实体时, key_name 在整个模型中不再是唯一的,而是在父子条目中是唯一的。真糟糕...

我相信我可以通过改变这两个模型相互关联的方式来解决这个新问题。

首先,我创建一个父对象,如上所述。接下来,我创建一个子实体并将第二个唯一值分配给它的 key_name。不同之处在于第二个实体具有对父模型的引用属性。我的第一个实体分配给引用属性,但没有分配给父参数。这不会强制一对一引用,但它确实使我的两个值保持唯一,并且只要我可以从事务中控制插入过程,我就可以管理这些对象的一对一性质。

这个新的解决方案仍然存在问题。根据 GAE 数据存储文档,如果更新中的各个实体不属于同一实体组,则无法在一个事务中执行多个数据库更新。由于我不再将第一个实体作为第二个实体的父实体,因此它们不再属于同一实体组,并且无法插入到同一事务中。

我又回到了原点。我可以做什么来解决这个问题?具体来说,我可以做什么来强制执行与一个模型实体关联的两个唯一值。正如你所看到的,我愿意发挥一点创意。这可以做到吗?我知道这需要一个开箱即用的解决方案,但必须有办法。

以下是我上周发布的问题的原始代码。我添加了一些注释和代码更改来实现解决此问题的第二次尝试。

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, #My prt object was previously the parent of child
                    parentEnt=prt,
                    str1=string1, 
                    str2_key=string2,
                    str3=string3,)
                child.put()
                return child
            #This should give me an error, b/c these two entities are no longer in the same entity group. :(
            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()

    #This is no longer a "parent" but a reference
    parentEnt = db.ReferenceProperty(reference_class=ParentEntity)
    #pertinent data below
    str3 =      db.StringProperty()

您描述的系统可以工作,但代价是交易性。请注意,第二个实体不再是子实体 - 它只是具有引用属性的另一个实体。

该解决方案可能足以满足您的需求 - 例如,如果您需要强制每个用户都有唯一的电子邮件地址,但这不是用户的主要标识符,您可以首先将记录插入“电子邮件”表中,如果成功,则插入您的主记录。如果在第一次操作之后但在第二次操作之前发生故障,则您的电子邮件地址没有关联记录。您可以简单地忽略这一点,或者为记录添加时间戳并允许在一段时间(例如,30 秒,前端请求的最大长度)后回收它。

如果您对事务性和唯一性的要求比这更强,那么还有其他复杂程度不断增加的选择,例如实施某种形式的分布式事务 http://blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engine,但您不太可能真正需要它。如果您可以告诉我们更多有关记录的性质和唯一键的信息,我们也许能够提供更详细的建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 GAE 数据存储数据模型创建两个唯一的可查询字段? 的相关文章

  • 如何生成给定范围内的回文数列表?

    假设范围是 1 X 120 这是我尝试过的 gt gt gt def isPalindrome s check if a number is a Palindrome s str s return s s 1 gt gt gt def ge
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐