2013-01-03 73 views
0

很简单塞纳里奥:独特的键/属性/属性在ZODB

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

我想通过自己的用户名的用户实例存储在ZODB,同时保持电子邮件独一无二的。

u1 = User(username="u1",email="[email protected]") 
zodb_container[u1.username] = u1 

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

回答

2

编号

ZODB有点不正确。它不像Postgres那样是一个“数据库”,或者MySQL是一个具有约束和查询语言的数据库,以及人们假定数据库具有的所有东西。相反,它是一个持久对象存储。除了管理大于可用内存的工作集,处理事务,并允许您在进程之间共享对象表示形式之外,ZODB没有为您做任何事情,因为Python的pickle模块不适合您。它实际上是“超级按钮”。

所以,如果你真的问过关于泡菜的相同问题,你的答案就没有什么不同了。

+0

嗨克里斯,非常感谢你!我想知道你什么时候符合这样的要求,你如何解决这个问题,以及推荐的做法是什么?我现在有两个选择:1,将ZODB与真正的关系数据库结合起来。 2,在ZODB中创建另一个字典并使用电子邮件地址作为密钥。所以我维护两本词典以保持用户名和电子邮件地址的唯一性。 – Xiong

+0

假设我选择第二个选项,我还有另一个问题:如果我在两个字典中两次保存相同的用户对象,ZODB会保留该用户对象的两个副本还是只保留一个副本?如果ZODB保留两个副本,那么我必须保存一个键(User.username)而不是整个User对象。顺便说一句,我想我最好马上做一个实验。 – Xiong

+0

ZODB只保留用户对象的一个​​副本。所以我打算使用两个字典来保持这两个属性的唯一性。 – Xiong