как обновить запись с помощью DBSession в turbogears 2

Привет, я пытаюсь обновить строку пользователя при входе пользователя в систему. Я просто хочу увеличить количество входов пользователей на единицу. Вот код в методе контроллера 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() в метод контроллера не приводит к ошибке, но и фактически не обновляет запись.


person Marc    schedule 07.01.2010    source источник
comment
Какое сообщение об ошибке вы получаете от DBSession.commit()?   -  person codeape    schedule 07.01.2010


Ответы (2)


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

person Marc    schedule 07.01.2010

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

DBSession.update(user)
person Stefan Lundström    schedule 07.01.2010