这里的关键是为什么 fetch
“几乎永远不应该使用”。文档说这fetch
将获得所有结果,因此必须同时将所有结果保存在内存中。如果您获得的数据很大,您将需要大量内存。
你说你可以包run
里面list
。当然,你可以这样做,但你会遇到完全相同的问题——<code>list 会强制所有元素进入内存。因此,实际上不鼓励这种解决方案与使用fetch
.
现在,你可以说:那我该怎么办?答案是:在大多数情况下,您可以一个一个地处理数据元素,而无需同时将它们全部保存在内存中。例如,如果您只需将结果数据放入 django 模板中,并且您知道它在模板中最多会使用一次,那么 django 模板将很乐意接受任何迭代器——因此您可以传递run
调用结果直接不包装成list
.
同样,如果您需要进行一些处理,例如查看结果以找到价格或排名最高的元素,或者其他任何内容,您可以迭代run
.
但是,如果您的使用需要将所有元素都保存在内存中(例如:您的 django 模板多次使用查询中的数据),那么您有一个案例fetch
或list(run(…))
实际上是有意义的。最后——这只是典型的权衡:如果您的应用程序需要应用一种算法,该算法需要内存中的所有数据,您需要通过耗尽内存来为此付出代价。因此,您可以重新设计您的算法和使用以使用迭代器,或者fetch
通过更长的处理时间和更高的内存使用来使用它并为此付费。谷歌当然鼓励你做第一件事。这就是“几乎不应该使用”的实际含义。