如何在Turbogears 2中使用DBSession更新记录
你好,我正在尝试在用户登录时更新用户的信息。我只是想把用户的登录次数加一。这里是我在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)这个方法。