擅长:python、mysql、java
<pre><code>lecture.queues.first().users.append(user)
</code></pre>
<p>意思是:</p>
<p>第一个()方法命中数据库并生成一个对象,我没有跟踪您的映射,但我猜测它是一个队列对象。在</p>
<p>然后,访问队列上的“users”集合。在</p>
<p>此时,Python本身<strong>垃圾收集</strong>队列-一旦返回“users”,就不会在任何地方引用它。这就是<a href="http://docs.python.org/2/extending/extending.html#reference-counts" rel="noreferrer">reference counting</a>垃圾回收的工作原理。在</p>
<p>然后尝试在“users”后面附加一个“user”。SQLAlchemy必须跟踪对所有映射属性的更改,如果要说<code>Queue.name = "some name"</code>,SQLAlchemy需要将其注册到父<code>Queue</code>对象中,以便它知道刷新它。如果您说<code>Queue.users.append(someuser)</code>,同样的想法,它需要向父级注册更改事件。在</p>
<p>SQLAlchemy不能这样做,因为<code>Queue</code>不见了。因此,消息被提出。SQLAlchemy在这里有一个<a href="http://docs.python.org/2/library/weakref.html#weakref.ref" rel="noreferrer">weakref</a>,因此它可以确切地知道发生了什么(我们不能阻止它,因为当我们在对象模型中创建不必要的<a href="http://en.wikipedia.org/wiki/Reference_counting#Dealing_with_reference_cycles" rel="noreferrer">reference cycles</a>时,人们会非常不安)。在</p>
<p>解决方案非常简单,也更易于阅读,即将查询结果分配给变量:</p>
^{pr2}$