SQLAlchemy - Session.query中的Session.commit循环重置对象__dict__

时间:2017-07-16 17:32:07

标签: python sqlalchemy

在迭代session.Query对象并调用update时,我注意到返回的对象不再填充__dict__个。

E.g。

foos = session.query(Foo)
for foo in foos:
    print "{}".format(foo.__dict__)
    foo.somefield = "somevalue"
    session.add(foo)
    session.commit()  # The next print statement won't show anything

如果在迭代期间读取了foo中的任何字段,则所有__dict__字段都会被解析。

E.g。

foos = session.query(Foo)
for foo in foos:
    # Reading any of the fields, causes all of the fields to be resolved.
    foo.somefield
    print "{}".format(foo.__dict__)
    foo.somefield = "somevalue"
    session.add(foo)
    session.commit()  # The next print statement won't show anything

有没有办法让这些值显示在__dict__而无需先读取它们?

1 个答案:

答案 0 :(得分:1)

发生这种情况的原因是,在您调用commit()后,SQLAlchemy会自动使您的实例失效。那么顺序会发生什么:

  1. 您加载了所有Foo s
  2. 打印__dict__,正常工作
  3. 提交
  4. 所有Foo已过期(清空所有__dict__的{​​{1}}
  5. 打印Foo,空,哎呀
  6. 读取字段将懒惰地从数据库重新加载实例,这就是为什么这样做的原因。您要做的是关闭expire_on_commit,例如如果您使用__dict__

    sessionmaker

    但请注意,天真的代码可能不再符合您的预期。