2011-06-27 66 views
1

我有一个用户更新功能,我允许用户更改他们的电子邮件地址,但同一地址在数据库中必须是唯一的,所以在更新之前,我必须检查他们的新电子邮件是否已存在于数据库中,但我用来检查的查询返回同一行。例如:sqlalchemy查询问题

user = User.query.get(1) 
user.email = '[email protected]' 

if user.validate(): # The validate function performs a query to see if '[email protected]' is already taken 
     user.save() 

现在正在进入验证功能,我有:

check = User.query.filter_by(User.email='[email protected]').first() 
if check: 
     # email already exists 

问题是,check持有我的编辑同一个用户。 Sqlalchemy将更新提交给数据库,但在某种事务下,所以我的查询返回了我正在编辑的同一用户。我已经通过创建第二个会话对象解决了这个问题,但看起来像是过度的。任何更好的想法?我有道理吗?

回答

1

在操纵现有用户之前,为什么不检查具有给定电子邮件地址的用户是否存在?你可以例如写一个独立的功能为:

def user_email_exists(email): 
    return (not User.query.filter(User.email=email) == None) 

试图改变用户对象之前,然后调用user_email_exists

... 

# User object to alter 
user = ... 

# the new email address, which needs to be checked 
new_email_addr = '[email protected]' 

if user_email_exists(new_email_addr): 
    raise SomeMeaningfulException() # or some `flash` message + a redirect 
else: 
    user.email = new_email_addr 
    db.session.add(user) 
    db.commit() 

... 
+0

用户名也是唯一的等等等等。我更喜欢我自己的方法,而不是在验证过程之外编写各种函数和查找,以获得相同的结果。 数据被大量分配,验证和保存/更新。我试图避免给个别领域过多的关注,这会导致很多不应该存在的代码(验证过程之外)。我有它的工作,但与第二届会议,查询外的第一个查询的会话/交易 –

0

最简单的方法可能只是在验证函数中向查询添加第二个过滤器。不要选择具有该电子邮件地址的任何用户,而要选择具有该电子邮件地址的任何用户,而不要使用相同的用户名或用户标识。这样,您确保只有在不同的用户拥有该电子邮件地址时才能获得回报。