Documentation: Clarify instructions about changing row_factory for SQLite3 (#1573)
* Clarify instructions about changing row_factory When I was working through the tutorial, this was very confusing to me; so, I've added the code and clarification that would have helped me get through it faster. * Clarify the nature of Row objects * Rewrite code example for further clarity.
This commit is contained in:
parent
c80ea941d0
commit
c0087204e5
1 changed files with 19 additions and 2 deletions
|
|
@ -71,7 +71,8 @@ Now in each request handling function you can access `g.db` to get the
|
||||||
current open database connection. To simplify working with SQLite, a
|
current open database connection. To simplify working with SQLite, a
|
||||||
row factory function is useful. It is executed for every result returned
|
row factory function is useful. It is executed for every result returned
|
||||||
from the database to convert the result. For instance, in order to get
|
from the database to convert the result. For instance, in order to get
|
||||||
dictionaries instead of tuples, this could be inserted into ``get_db``::
|
dictionaries instead of tuples, this could be inserted into the ``get_db``
|
||||||
|
function we created above::
|
||||||
|
|
||||||
def make_dicts(cursor, row):
|
def make_dicts(cursor, row):
|
||||||
return dict((cursor.description[idx][0], value)
|
return dict((cursor.description[idx][0], value)
|
||||||
|
|
@ -79,10 +80,26 @@ dictionaries instead of tuples, this could be inserted into ``get_db``::
|
||||||
|
|
||||||
db.row_factory = make_dicts
|
db.row_factory = make_dicts
|
||||||
|
|
||||||
Or even simpler::
|
This will make the sqlite3 module return dicts for this database connection, which are much nicer to deal with. Even more simply, we could place this in ``get_db`` instead::
|
||||||
|
|
||||||
db.row_factory = sqlite3.Row
|
db.row_factory = sqlite3.Row
|
||||||
|
|
||||||
|
This would use Row objects rather than dicts to return the results of queries. These are ``namedtuple`` s, so we can access them either by index or by key. For example, assuming we have a ``sqlite3.Row`` called ``r`` for the rows ``id``, ``FirstName``, ``LastName``, and ``MiddleInitial``::
|
||||||
|
|
||||||
|
>>> # You can get values based on the row's name
|
||||||
|
>>> r['FirstName']
|
||||||
|
John
|
||||||
|
>>> # Or, you can get them based on index
|
||||||
|
>>> r[1]
|
||||||
|
John
|
||||||
|
# Row objects are also iterable:
|
||||||
|
>>> for value in r:
|
||||||
|
... print(value)
|
||||||
|
1
|
||||||
|
John
|
||||||
|
Doe
|
||||||
|
M
|
||||||
|
|
||||||
Additionally, it is a good idea to provide a query function that combines
|
Additionally, it is a good idea to provide a query function that combines
|
||||||
getting the cursor, executing and fetching the results::
|
getting the cursor, executing and fetching the results::
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue