вопрос sqlalchemy - PullRequest
       12

вопрос sqlalchemy

1 голос
/ 27 июня 2011

У меня есть функция обновления пользователя, и я разрешаю пользователям изменять свой адрес электронной почты, но этот же адрес должен быть уникальным в базе данных, поэтому перед обновлением я должен проверить, существует ли их новый адрес электронной почты в базе данных, но запрос яиспользуйте, чтобы проверить, что возвращает ту же строку.Пример:

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 ]

1 голос
/ 27 июня 2011

Почему бы не проверить, существует ли пользователь с данным адресом электронной почты, прежде чем манипулировать существующим пользователем? Вы могли бы, например, напишите для этого отдельную функцию:

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

...
0 голосов
/ 29 июня 2011

Возможно, самый простой способ - просто добавить второй фильтр к запросу внутри вашей функции проверки.Вместо того, чтобы он выбирал любого пользователя с таким адресом электронной почты, пусть он выбирает любого пользователя с таким адресом электронной почты, а НЕ с тем же именем пользователя или идентификатором пользователя.Таким образом, вы гарантированно получите возврат, только если есть другой пользователь с таким адресом электронной почты.

...