擅长:python、mysql、java
<p>存在<code>sessionmaker()</code>的原因是,它所需的各种“配置”参数只需在一个地方设置,而不需要一遍又一遍地重复“bind=engine、autoflush=False、expire\on_commit=False”等。此外,<code>sessionmaker()</code>还提供了一个“可更新”接口,这样您就可以在应用程序中的某个地方设置它:</p>
<pre><code>session = sessionmaker(expire_on_commit=False)
</code></pre>
<p>但稍后,当您知道要与哪个数据库通信时,可以向其中添加配置:</p>
<pre><code>session.configure(bind=create_engine("some engine"))
</code></pre>
<p>它还充当一个“可调用”来传递给非常常见的<code>scoped_session()</code>构造:</p>
<pre><code>session = scoped_session(sessionmaker(bind=engine))
</code></pre>
<p>尽管如此,这些只是文档所指的约定,以便呈现一致的“如何使用”故事。如果更方便的话,没有理由不能直接使用构造函数,我一直在使用<code>Session()</code>构造函数。只是,在一个不平凡的应用程序中,您可能最终会在某种可调用函数内部粘贴对<code>Session()</code>的构造函数调用,<code>sessionmaker()</code>作为该可调用函数的默认值。</p>