Clarified QuerySet.iterator()'s docs on server-side cursors.

This commit is contained in:
François Freitag 2017-05-27 18:12:18 -07:00 committed by Tim Graham
parent 9af6c97504
commit bf50ae8210
2 changed files with 24 additions and 6 deletions

View File

@ -43,11 +43,12 @@ div.nav { margin: 0; font-size: 11px; text-align: right; color: #487858;}
/*** basic styles ***/ /*** basic styles ***/
dd { margin-left:15px; } dd { margin-left:15px; }
h1,h2,h3,h4 { margin-top:1em; font-family:"Trebuchet MS",sans-serif; font-weight:normal; } h1,h2,h3,h4,h5 { margin-top:1em; font-family:"Trebuchet MS",sans-serif; font-weight:normal; }
h1 { font-size:218%; margin-top:0.6em; margin-bottom:.4em; line-height:1.1em; } h1 { font-size:218%; margin-top:0.6em; margin-bottom:.4em; line-height:1.1em; }
h2 { font-size:175%; margin-bottom:.6em; line-height:1.2em; color:#092e20; } h2 { font-size:175%; margin-bottom:.6em; line-height:1.2em; color:#092e20; }
h3 { font-size:150%; font-weight:bold; margin-bottom:.2em; color:#487858; } h3 { font-size:150%; font-weight:bold; margin-bottom:.2em; color:#487858; }
h4 { font-size:125%; font-weight:bold; margin-top:1.5em; margin-bottom:3px; } h4 { font-size:125%; font-weight:bold; margin-top:1.5em; margin-bottom:3px; }
h5 { font-size:110%; font-weight:bold; margin-top:1em; margin-bottom:3px; }
div.figure { text-align: center; } div.figure { text-align: center; }
div.figure p.caption { font-size:1em; margin-top:0; margin-bottom:1.5em; color: #555;} div.figure p.caption { font-size:1em; margin-top:0; margin-bottom:1.5em; color: #555;}
hr { color:#ccc; background-color:#ccc; height:1px; border:0; } hr { color:#ccc; background-color:#ccc; height:1px; border:0; }

View File

@ -2021,15 +2021,32 @@ evaluated will force it to evaluate again, repeating the query.
Also, use of ``iterator()`` causes previous ``prefetch_related()`` calls to be Also, use of ``iterator()`` causes previous ``prefetch_related()`` calls to be
ignored since these two optimizations do not make sense together. ignored since these two optimizations do not make sense together.
Some Python database drivers still load the entire result set into memory, but Depending on the database backend, query results will either be loaded all at
won't cache results after iterating over them. Oracle and :ref:`PostgreSQL once or streamed from the database using server-side cursors.
<postgresql-server-side-cursors>` use server-side cursors to stream results
from the database without loading the entire result set into memory. With server-side cursors
^^^^^^^^^^^^^^^^^^^^^^^^
Oracle and :ref:`PostgreSQL <postgresql-server-side-cursors>` use server-side
cursors to stream results from the database without loading the entire result
set into memory.
The Oracle database driver always uses server-side cursors.
On PostgreSQL, server-side cursors will only be used when the On PostgreSQL, server-side cursors will only be used when the
:setting:`DISABLE_SERVER_SIDE_CURSORS <DATABASE-DISABLE_SERVER_SIDE_CURSORS>` :setting:`DISABLE_SERVER_SIDE_CURSORS <DATABASE-DISABLE_SERVER_SIDE_CURSORS>`
setting is ``False``. Read :ref:`transaction-pooling-server-side-cursors` if setting is ``False``. Read :ref:`transaction-pooling-server-side-cursors` if
you're using a connection pooler configured in transaction pooling mode. you're using a connection pooler configured in transaction pooling mode. When
server-side cursors are disabled, the behavior is the same as databases that
don't support server-side cursors.
Without server-side cursors
^^^^^^^^^^^^^^^^^^^^^^^^^^^
MySQL and SQLite don't support streaming results, hence the Python database
drivers load the entire result set into memory. The result set is then
transformed into Python row objects by the database adapter using the
``fetchmany()`` method defined in :pep:`249`.
.. versionchanged:: 1.11 .. versionchanged:: 1.11