Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.python > #78513
| From | Peter Otten <__peter__@web.de> |
|---|---|
| Subject | Re: Using namedtuple with sqlite, surely it can do better than the example |
| Date | 2014-10-01 01:06 +0200 |
| Organization | None |
| References | <n3krfb-mo1.ln1@chris.zbmc.eu> |
| Newsgroups | comp.lang.python |
| Message-ID | <mailman.14499.1412118425.18130.python-list@python.org> (permalink) |
cl@isbd.net wrote:
> In the namedtuple documentation there's an example:-
>
> EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title,
> department, paygrade')
>
> import sqlite3
> conn = sqlite3.connect('/companydata')
> cursor = conn.cursor()
> cursor.execute('SELECT name, age, title, department, paygrade FROM
> employees') for emp in map(EmployeeRecord._make, cursor.fetchall()):
> print emp.name, emp.title
>
> (I've deleted the csv bit)
>
> Surely having to match up the "name, age, title, department,
> paygrade" between the tuple and the database can be automated, the
> example is rather pointless otherwise. At the very least one should
> use the same variable instance for both, but it should be possible to
> get the tuple names from the database.
It's an example meant to convey the basic idea -- you can add bells and
whistles in your actual code. Something like
#!/usr/bin/env python3
import sqlite3
import functools
from collections import namedtuple
def make_namedtuple_row_factory():
last_pair = (None, None) # description, rowtype
@functools.lru_cache(maxsize=500)
def make_rowtype(description):
return namedtuple("Row",
[column[0] for column in description])._make
def make_namedtuple_is_make(cursor, row):
nonlocal last_pair
this_description = cursor.description
last_description, last_rowtype = last_pair
if last_description is this_description:
return last_rowtype(row)
this_rowtype = make_rowtype(this_description)
last_pair = this_description, this_rowtype
return this_rowtype(row)
return make_namedtuple_is_make
db = sqlite3.connect("companydata")
cursor = db.cursor()
cursor.row_factory = make_namedtuple_row_factory()
for employee in cursor.execute(
'SELECT name, age, title, department, paygrade FROM employees'):
print(employee.name, employee.title)
might be easy to use and have acceptable performance, but most of the code
distracts from the namedtuple usage.
Back to comp.lang.python | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Using namedtuple with sqlite, surely it can do better than the example cl@isbd.net - 2014-09-30 22:32 +0100 Re: Using namedtuple with sqlite, surely it can do better than the example Peter Otten <__peter__@web.de> - 2014-10-01 01:06 +0200 Re: Using namedtuple with sqlite, surely it can do better than the example Mark Lawrence <breamoreboy@yahoo.co.uk> - 2014-10-01 00:23 +0100
csiph-web