Browse Source

Fixed #25326 -- Added namedtuple example for executing custom SQL.

Dražen Odobašić 9 years ago
parent
commit
5ab65ca5c9
1 changed files with 30 additions and 8 deletions
  1. 30 8
      docs/topics/db/sql.txt

+ 30 - 8
docs/topics/db/sql.txt

@@ -275,28 +275,50 @@ alias::
     cursor = connections['my_db_alias'].cursor()
     # Your code here...
 
-By default, the Python DB API will return results without their field
-names, which means you end up with a ``list`` of values, rather than a
-``dict``. At a small performance cost, you can return results as a
-``dict`` by using something like this::
+By default, the Python DB API will return results without their field names,
+which means you end up with a ``list`` of values, rather than a ``dict``. At a
+small performance and memory cost, you can return results as a ``dict`` by
+using something like this::
 
     def dictfetchall(cursor):
-        "Returns all rows from a cursor as a dict"
+        "Return all rows from a cursor as a dict"
         desc = cursor.description
         return [
             dict(zip([col[0] for col in desc], row))
             for row in cursor.fetchall()
         ]
 
-Here is an example of the difference between the two::
+Another option is to use :func:`collections.namedtuple` from the Python
+standard library. A ``namedtuple`` is a tuple-like object that has fields
+accessible by attribute lookup; it's also indexable and iterable. Results are
+immutable and accessible by field names or indices, which might be useful::
+
+    from collections import namedtuple
+
+    def namedtuplefetchall(cursor):
+        "Return all rows from a cursor as a namedtuple"
+        desc = cursor.description
+        nt_result = namedtuple('Result', [col[0] for col in desc])
+        return [nt_result(*row) for row in cursor.fetchall()]
+
+Here is an example of the difference between the three::
 
     >>> cursor.execute("SELECT id, parent_id FROM test LIMIT 2");
     >>> cursor.fetchall()
-    ((54360982L, None), (54360880L, None))
+    ((54360982, None), (54360880, None))
 
     >>> cursor.execute("SELECT id, parent_id FROM test LIMIT 2");
     >>> dictfetchall(cursor)
-    [{'parent_id': None, 'id': 54360982L}, {'parent_id': None, 'id': 54360880L}]
+    [{'parent_id': None, 'id': 54360982}, {'parent_id': None, 'id': 54360880}]
+
+    >>> cursor.execute("SELECT id, parent_id FROM test LIMIT 2");
+    >>> results = namedtuplefetchall(cursor)
+    >>> results
+    [Result(id=54360982, parent_id=None), Result(id=54360880, parent_id=None)]
+    >>> results[0].id
+    54360982
+    >>> results[0][0]
+    54360982
 
 Connections and cursors
 -----------------------