当迭代session.Query对象并调用更新时,我注意到返回的对象不再__dict__填充它们的's 。
例如
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
Run Code Online (Sandbox Code Playgroud)
但是,如果foo在迭代期间读取了 中的任何字段,则所有__dict__字段都会被解析。
例如
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
Run Code Online (Sandbox Code Playgroud)
有没有办法让这些值出现__dict__而无需先阅读它们?
发生这种情况的原因是 SQLAlchemy 在您调用commit(). 那么依次发生什么:
Foo的__dict__, 作品Foos 都已过期(清空__dict__所有Foos)__dict__,空,哎呀读取一个字段会懒惰地从数据库中重新加载实例,这就是它起作用的原因。您想要做的是关闭expire_on_commit,例如,如果您使用sessionmaker:
Session = sessionmaker(expire_on_commit=False)
Run Code Online (Sandbox Code Playgroud)
但请注意,原始代码可能不再按您的预期运行。
| 归档时间: |
|
| 查看次数: |
843 次 |
| 最近记录: |