如何为 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 数据存储数据模型创建两个唯一的可查询字段? 的相关文章

  • 如何在多进程系统中实现锁定?

    我们正在并行运行许多詹金斯项目 我们使用 python 并且选择使用 pyenv 管理虚拟环境 不幸的是 pyenv 有一个众所周知的竞争条件 https github com yyuu pyenv issues 174 为了解决这个问题
  • Python 切片对象和 __getitem__

    python 中是否有内部的东西来处理传递给的参数 getitem 不同 并自动转换start stop step构造成切片 这是我的意思的演示 class ExampleClass object def getitem self args
  • 从文本文件中删除特定字符

    我对 Python 和编码都很陌生 我当时正在做一个小项目 但遇到了一个问题 44 1 6 23 2 7 49 2 3 53 2 1 68 1 6 71 2 7 我只需要从每行中删除第三个和第六个字符 或者更具体地说 从整个文件中删除 字符
  • 使用 django-rest-framework 设置对象级权限

    尝试使用 django rest framework 最干净 最规范地管理 django guardian 对象级权限 我想将对象的读取权限 module view object 分配给在执行 POST 时发出请求的用户 我的基于阶级的观点
  • 反编译Python 3.9.2的PYC文件[重复]

    这个问题在这里已经有答案了 目前 我有一个 3 9 2 版本的 python 的 PYC 文件 P S 这适用于所有 3 9 及更高版本 我正在尝试反编译 PYC 文件 但它显示错误 因为 uncompyle6 或者更确切地说 新版本 de
  • 是否可以从 Julia 调用 Python 函数并返回其结果?

    我正在使用 Python 从网络上抓取数据 我想使用这些数据在 Julia 中运行计算 是否可以在 Julia 中调用该函数并返回其结果 或者我最好直接导出到 CSV 并以这种方式加载数据 绝对地 看PyCall jl https gith
  • 协程从未被等待

    我正在使用一个简单的上下文管理器 其中包含一个异步循环 class Runner def init self self loop asyncio get event loop def enter self return self def e
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • 类型错误:需要二进制或 unicode 字符串,得到 618.0

    I ve been trying to implement this ML Linear Model into my dataset https www tensorflow org tutorials estimator linear L
  • Arcpy 模数在 Pycharm 中不显示

    如何将 Arcpy 集成到 Pycharm 中 我尝试通过导入模块但它没有显示 我确实知道该模块仅适用于 2 x python arcpy 在 PyPi Python 包索引 上不可用 因此无法通过 pip 安装 要使用 arcpy 您需要
  • Python HMAC:类型错误:字符映射必须返回整数、None 或 unicode

    我在使用 HMAC 时遇到了一个小问题 运行这段代码时 signature hmac new key secret key msg string to sign digestmod sha1 我收到一个奇怪的错误 File usr loca
  • 运行 Python 单元测试,以便成功时不打印任何内容,失败时仅打印 AssertionError()

    我有一个标准单元测试格式的测试模块 class my test unittest TestCase def test 1 self tests def test 2 self tests etc 我的公司有一个专有的测试工具 它将作为命令行
  • 查找 Pandas DF 行中的最短日期并创建新列

    我有一个包含多个日期的表 有些日期将为 NaN 我需要找到最旧的日期 所以一行可能有 DATE MODIFIED WITHDRAWN DATE SOLD DATE STATUS DATE 等 因此 对于每一行 一个或多个字段中都会有一个日期
  • 使用另一个数据帧在数据帧中创建子列

    我对 python 和 pandas 很陌生 在这里 我有一个以下数据框 did features offset word JAPE feature manual feature 0 200 0 aa 200 200 0 200 11 bf
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • minizinc python 安装

    我通过 anaconda 提示符在 python 上安装了 minizinc 就像其他软件包一样 pip install minizinc 该软件包表示已成功安装 我可以导入该模块 但是 我正在遵循基本示例https minizinc py
  • Django 管理器链接

    我想知道是否有可能 如果可以的话 如何 将多个管理器链接在一起以生成受两个单独管理器影响的查询集 我将解释我正在研究的具体示例 我有多个抽象模型类 用于为其他模型提供小型的特定功能 其中两个模型是DeleteMixin 和GlobalMix
  • 带 Flask 的 RPI dht22:无法将第 4 行设置为输入 - 等待 PulseIn 消息超时

    我正在尝试制作一个 Raspberry Pi 3 REST API 使用 DHT22 提供温度和湿度 整个代码 from flask import Flask jsonify request from sds011 import SDS01
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • 用于插入或替换 URL 参数的 Django 模板标签

    有人知道 Django 模板标签可以获取当前路径和查询字符串并插入或替换查询字符串值吗 例如向 some custom path q how now brown cow page 3 filter person 发出请求 电话 urlpar

随机推荐