<i id='yBeUS'><tr id='yBeUS'><dt id='yBeUS'><q id='yBeUS'><span id='yBeUS'><b id='yBeUS'><form id='yBeUS'><ins id='yBeUS'></ins><ul id='yBeUS'></ul><sub id='yBeUS'></sub></form><legend id='yBeUS'></legend><bdo id='yBeUS'><pre id='yBeUS'><center id='yBeUS'></center></pre></bdo></b><th id='yBeUS'></th></span></q></dt></tr></i><div id='yBeUS'><tfoot id='yBeUS'></tfoot><dl id='yBeUS'><fieldset id='yBeUS'></fieldset></dl></div>

      • <bdo id='yBeUS'></bdo><ul id='yBeUS'></ul>

      <legend id='yBeUS'><style id='yBeUS'><dir id='yBeUS'><q id='yBeUS'></q></dir></style></legend>
    1. <small id='yBeUS'></small><noframes id='yBeUS'>

    2. <tfoot id='yBeUS'></tfoot>

      SQLAlChemy-Session.query循环中的Session.Commit重置对象__dict__

      时间:2024-04-20

            <i id='hvBjF'><tr id='hvBjF'><dt id='hvBjF'><q id='hvBjF'><span id='hvBjF'><b id='hvBjF'><form id='hvBjF'><ins id='hvBjF'></ins><ul id='hvBjF'></ul><sub id='hvBjF'></sub></form><legend id='hvBjF'></legend><bdo id='hvBjF'><pre id='hvBjF'><center id='hvBjF'></center></pre></bdo></b><th id='hvBjF'></th></span></q></dt></tr></i><div id='hvBjF'><tfoot id='hvBjF'></tfoot><dl id='hvBjF'><fieldset id='hvBjF'></fieldset></dl></div>
            <tfoot id='hvBjF'></tfoot>
              <tbody id='hvBjF'></tbody>
              • <bdo id='hvBjF'></bdo><ul id='hvBjF'></ul>
                <legend id='hvBjF'><style id='hvBjF'><dir id='hvBjF'><q id='hvBjF'></q></dir></style></legend>

                <small id='hvBjF'></small><noframes id='hvBjF'>

                本文介绍了SQLAlChemy-Session.query循环中的Session.Commit重置对象__dict__的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

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

                例如

                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__字段。

                例如

                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__中,而无需先读取它们?

                推荐答案

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

                1. 您加载所有Foo
                2. 打印__dict__,作品
                3. 提交
                4. 所有Foo均已过期(清空所有Foo中的__dict__)
                5. 打印__dict__,空,Oops

                读取字段将延迟地从数据库重新加载实例,这就是这种方式工作的原因。您要做的是关闭expire_on_commit,例如,如果您使用sessionmaker

                Session = sessionmaker(expire_on_commit=False)
                

                但请注意,朴素的代码可能不再执行您预期的操作。

                这篇关于SQLAlChemy-Session.query循环中的Session.Commit重置对象__dict__的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                上一篇:如何验证SqlAlChemy引擎对象 下一篇:具有所选列的SQLAlChemy中的BETWEEN子句

                相关文章

              • <i id='MqgVy'><tr id='MqgVy'><dt id='MqgVy'><q id='MqgVy'><span id='MqgVy'><b id='MqgVy'><form id='MqgVy'><ins id='MqgVy'></ins><ul id='MqgVy'></ul><sub id='MqgVy'></sub></form><legend id='MqgVy'></legend><bdo id='MqgVy'><pre id='MqgVy'><center id='MqgVy'></center></pre></bdo></b><th id='MqgVy'></th></span></q></dt></tr></i><div id='MqgVy'><tfoot id='MqgVy'></tfoot><dl id='MqgVy'><fieldset id='MqgVy'></fieldset></dl></div>

                  1. <tfoot id='MqgVy'></tfoot>
                      <bdo id='MqgVy'></bdo><ul id='MqgVy'></ul>

                    <small id='MqgVy'></small><noframes id='MqgVy'>

                  2. <legend id='MqgVy'><style id='MqgVy'><dir id='MqgVy'><q id='MqgVy'></q></dir></style></legend>