【问题标题】:how to update a record using DBSession in turbogears 2如何在 turbogears 2 中使用 DBSession 更新记录
【发布时间】:2010-01-07 05:54:06
【问题描述】:

您好,我正在尝试在用户登录时更新用户行。我只是想将用户登录次数增加一。这是 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() 不会出错,但实际上也不会更新记录。

【问题讨论】:

  • 从 DBSession.commit() 得到什么错误信息?

标签: python sqlalchemy turbogears2


【解决方案1】:

抱歉,TG2 事务管理器毕竟在工作。出现错误是因为我在事务管理器之外调用 post_login 函数,因此记录更新没有被刷新。我不知道为什么它不让我承诺。但是我移动了 post_login 控制器,现在我指定的上述代码可以工作,它会自动更新——甚至不需要 DBSession.update(user)。

【讨论】:

    【解决方案2】:

    你必须告诉会话对象更新对象:

    DBSession.update(user)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多