【问题标题】:unique key/attribute/property in zodbzodb 中的唯一键/属性/属性
【发布时间】:2013-01-03 04:29:09
【问题描述】:

非常简单的场景:

class User(Persistent):
  def __init__(self, username, email):
    self.username = username
    self.email = email

我想通过用户名将用户实例存储在 zodb 中,同时保持电子邮件的唯一性。

u1 = User(username="u1",email="u1@example.com")
zodb_container[u1.username] = u1

我使用用户名作为密钥来存储这个对象,所以它是唯一的。我的问题是如何保持电子邮件属性的唯一性?有没有什么优雅的方法可以在对象数据库中做到这一点?

【问题讨论】:

    标签: zodb object-oriented-database


    【解决方案1】:

    没有。

    ZODB 的名称有些不妥。它不是像 Postgres 或 MySQL 那样的“数据库”,而是一个具有约束和查询语言以及人们认为数据库具有的所有东西的数据库。相反,它是一个持久对象存储。除了管理大于可用内存的工作集、处理事务以及允许您在进程之间共享对象表示之外,ZODB 没有为您做任何 Python 的 pickle 模块不为您做的事情。它实际上是“superpickle”。

    所以你的答案与你问同样的泡菜问题没有什么不同,真的。

    【讨论】:

    • 嗨,克里斯,非常感谢!我想知道你什么时候遇到这样的要求,你是如何解决的,推荐的做法是什么?我现在有两个选择:1,将 ZODB 与真正的关系数据库结合起来。 2、在ZODB中创建另一个字典,并使用email地址作为key。所以我维护了两个字典来保持用户名和电子邮件地址的唯一性。
    • 假设我选择第二个选项,我还有一个问题:如果我在两个字典中保存相同的用户对象两次,ZODB 会保留该用户对象的两个副本还是只保留一个副本?如果 ZODB 保留两个副本,那么我只需要保存一个键(User.username)而不是整个 User 对象。顺便说一句,我想我最好马上做一个实验。
    • ZODB 只保留用户对象的一份副本。所以我将使用两个字典来保持两个属性的唯一性。
    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 2020-10-25
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 2010-09-11
    • 2011-11-06
    • 2016-02-20
    相关资源
    最近更新 更多