1

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

user = User.query.get(1)
user.email = 'some@email.com'

if user.validate(): # The validate function performs a query to see if 'some@email.com' is already taken
        user.save()

现在进入我拥有的验证功能:

check = User.query.filter_by(User.email='some@email.com').first()
if check:
        # email already exists

问题是check持有我正在编辑的同一个用户。Sqlalchemy 将更新提交到数据库,但在某种事务下,因此我的查询返回我正在编辑的同一用户。我已经通过创建第二个会话对象解决了这个问题,但似乎有点矫枉过正。有更好的想法吗?我说得有道理吗?

4

2 回答 2

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 = 'new@shiny.com' 

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()

...
于 2011-06-27T18:22:13.617 回答
0

最简单的方法可能只是在 validate 函数内的查询中添加第二个过滤器。与其选择具有该电子邮件地址的任何用户,不如让它选择具有该电子邮件地址的任何用户,而不是相同的用户名或用户 ID。这样,您就可以确保只有在有其他用户使用该电子邮件地址时才能获得退货。

于 2011-06-28T21:54:53.043 回答