sqlalchemy查询问题

sqlalchemy查询问题,sqlalchemy,flask-sqlalchemy,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 alre

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

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将更新提交到数据库,但在某种事务下,因此我的查询返回我正在编辑的同一用户。我通过创建第二个session对象解决了这个问题,但似乎有些过分了。还有更好的主意吗?我说得通吗?

在操作现有用户之前,为什么不检查具有给定电子邮件地址的用户是否存在?例如,您可以为此编写一个独立函数:

def user_email_exists(email):
    return (not User.query.filter(User.email=email) == None)
然后在尝试更改用户对象之前调用
user\u email\u 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()

...

在操作现有用户之前,为什么不检查具有给定电子邮件地址的用户是否存在?例如,您可以为此编写一个独立函数:

def user_email_exists(email):
    return (not User.query.filter(User.email=email) == None)
然后在尝试更改用户对象之前调用
user\u email\u 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()

...

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

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

用户名也是唯一的等。我更喜欢我自己的方法,而不是在验证过程之外编写各种函数和查找,只是为了实现同样的结果。大量分配、验证和保存/更新数据。我试图避免过多地关注单个字段,这会导致大量不应该存在的代码(在验证过程之外)。我可以使用它,但第二个会话在第一个查询的会话/transactionusername之外进行查询也是唯一的等等。我更喜欢我自己的方法,而不是在验证过程之外编写各种函数和查找,只是为了获得相同的结果。大量分配、验证和保存/更新数据。我试图避免过多地关注单个字段,这会导致大量不应该存在的代码(在验证过程之外)。我让它工作,但是第二个会话在第一个查询的会话/事务之外进行查询