2012-03-12 2 views
64

Предположим, стол имеет три столбца: username, password и no_of_logins.Как обновить запись строки SQLAlchemy?

Когда пользователь пытается войти в систему, она проверяется на запись с запросом, как

user=User.query.filter_by(username=form.username.data).first() 

Если пароль совпадает, то он идет дальше. То, что я хотел бы сделать, - подсчитать, сколько раз пользователь вошел в систему. Таким образом, всякий раз, когда он успешно регистрируется, я хотел бы увеличить поле no_of_logins и сохранить его обратно в таблицу пользователя. Я не уверен, как запустить запрос на обновление с помощью SqlAlchemy.

ответ

65
user.no_of_logins += 1 
session.commit() 
+5

http://stackoverflow.com/a/2334917/125507 говорит, что это плохой способ сделать это. И что, если строка еще не существует? – endolith

+2

Как и в случае с эндолитом, 'user.no_of_logins + = 1' может создавать условия гонки. Вместо этого используйте 'user.no_of_logins = user.no_of_logins + 1'. Последним правильным способом является преобразование в sql: 'SET no_of_logins = no_of_logins + 1'. – ChaimG

+0

@ChaimG Я предполагаю, что вы имели в виду 'user.no_of_logins = User.no_of_logins + 1', или, другими словами, использовать инструментальный атрибут модели для создания выражения SQL. Поскольку в вашем комментарии отображается 2 способа создания одного и того же состояния гонки. –

1

С помощью user=User.query.filter_by(username=form.username.data).first() заявления вы получите указанного пользователя в user переменной.

Теперь вы можете изменить значение новой переменной объекта, как user.no_of_logins += 1, и сохранить изменения с помощью метода фиксации session.

169

Есть несколько способов UPDATE с помощью sqlalchemy

1) user.no_of_logins += 1 
    session.commit() 

2) session.query().\ 
     filter(User.username == form.username.data).\ 
     update({"no_of_logins": (User.no_of_logins +1)}) 
    session.commit() 

3) conn = engine.connect() 
    stmt = User.update().\ 
     values(no_of_logins=(User.no_of_logins + 1)).\ 
     where(User.username == form.username.data) 
    conn.execute(stmt) 

4) setattr(user, 'no_of_logins', user.no_of_logins+1) 
    session.commit() 
+3

Этот ответ охватывает все сценарии. – Ricardo

+1

Я использую '' 'setattr (query_result, key, value)' '' для некоторых обновлений в Flask SQLAlchemy, за которыми следует фиксация. Любая причина для дисконта этой модели? –

+1

@ datamafia: вы можете использовать 'setattr (query_result, key, value)', что в точности эквивалентно записи 'query_result.key = value' –

Смежные вопросы