как обновить запись с помощью DBSession в турбогенераторах 2 - PullRequest
0 голосов
/ 07 января 2010

Привет. Я пытаюсь обновить строку пользователя при входе пользователя в систему. Я просто хочу увеличить количество входов пользователей в систему на единицу. Вот код в методе контроллера post_login:

@expose()  
def post_login(self, came_from=url('/')):  
    """  
    Redirect the user to the initially requested page on successful  
    authentication or redirect her back to the login page if login failed.  
    """  
    if not request.identity:  
        login_counter = request.environ['repoze.who.logins'] + 1  
        redirect(url('/user/login', came_from=came_from, __logins=login_counter))  

    user_name = request.identity['repoze.who.userid']
    user = User.by_user_name(user_name)
    user.tll_num_logins += 1
    user.tll_last_login = datetime.now()
    redirect(came_from)

Пользовательская запись просто не обновляется в базе данных. В документации TG говорится, что менеджер транзакций должен сбрасывать все транзакции и автоматически выполнять весь ожидающий SQL, но, похоже, он не работает с обновлением. Я попытался вставить DBSession.commit () после фиксации вручную, но получил сообщение об ошибке. Аналогично, добавление DBSession.flush () в метод контроллера не приводит к ошибке, но фактически не обновляет запись.

Ответы [ 2 ]

2 голосов
/ 07 января 2010

Извините, оказалось, что менеджер транзакций TG2 все-таки работал. Ошибка произошла, потому что я вызывал функцию post_login вне диспетчера транзакций, и поэтому обновление записи не сбрасывалось. Я не уверен, почему это не позволило мне совершить коммит. Но я переместил контроллер post_login, и теперь указанный выше код работает, он обновляется автоматически - нет необходимости даже для DBSession.update (user).

1 голос
/ 07 января 2010

Вы должны указать объекту сеанса обновить объект:

DBSession.update(user)
...