如何在Turbogears 2中使用DBSession更新记录

0 投票
2 回答
793 浏览
提问于 2025-04-15 17:44

你好,我正在尝试在用户登录时更新用户的信息。我只是想把用户的登录次数加一。这里是我在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 个回答

1

你需要告诉会话对象去更新这个对象:

DBSession.update(user)
2

抱歉大家,原来TG2的事务管理器其实是正常工作的。错误发生是因为我在事务管理器之外调用了post_login这个函数,所以记录的更新没有被处理。我不太明白为什么它不让我提交。不过我把post_login控制器移动了一下,现在我之前提到的代码可以正常工作了,它会自动更新——甚至不需要用到DBSession.update(user)这个方法。

撰写回答