【问题标题】:sql-alchemy open session from an active sessionsql-alchemy 从活动会话打开会话
【发布时间】:2018-02-22 04:14:42
【问题描述】:

我是 sql-alchemy 的新手,并试图了解在以下情况下会发生什么:

假设我有以下代码:

with db.mysession() as session:
     first_obj = session.query(db.my_table).filter(db.obj.index == 1)
     second_obj = session.query(db.my_table).filter(db.obj.index == 2)
     first_obj.delete()
     # note this was not commited to the db and I'm creating a new session
     session = db.mysession()
     second_obj_2 = session.query(db.my_table).filter(db.obj.index == 2)
     second_obj_2 = "some_change"

mysession() 只是打开和 sqlalchemy 会话到数据库并在退出时关闭它。

  • 问题是会发生什么?被删除的对象是否真的被删除了?还是不是因为会话被覆盖?
  • 这两个会话之间有什么区别吗?在这段代码的末尾我会看到哪些变化?
  • 我没有故意关闭内部会话,未关闭的会话会怎样?

【问题讨论】:

  • 上下文处理仍然看到原始会话,所以这取决于你的上下文处理程序做什么。
  • 在这种情况下默认的上下文处理程序会做什么?
  • 问题是:mysession是什么?
  • 不,问题如下:在这段代码的末尾,哪些更改保存到数据库,哪些不保存?为什么?
  • 要回答这个问题,您必须提供 mysession 是什么以及做什么。 (对delete() 调用感到困惑,但注意到您只使用查询对象)。

标签: python python-2.7 orm sqlalchemy


【解决方案1】:

所以,经过一番调查,发生了以下事情:

我们打开会话上下文而不关闭它,导致 session._depth 变得不平衡,因此外部上下文无法提交,因此所有更改都没有提交。

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多