sqlalchemy查询问题

时间:2011-06-27 18:15:09

标签: sqlalchemy flask-sqlalchemy

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

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将更新提交给数据库但在某种事务下,所以我的查询返回我正在编辑的同一用户。我已经通过创建第二个会话对象来解决这个问题,但看起来有点过分。有更好的想法吗?我有道理吗?

2 个答案:

答案 0 :(得分: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()

...

答案 1 :(得分:0)

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