[PYTHON DB-SIG] DB-Modules returning lists of dicts

David Morley morley@aaii.oz.au
Fri, 10 Jan 1997 10:09:46 +1100



Harri Pasanen wrote:
> 
> I think the space overhead criteria alone is sufficiently strong to do
> without a dictionary for each row.
> 
> The proper approach in my mind is to wrap the tuple access inside a
> class, which can provide very natural access to each field.
> 
> Possible interfaces to data, assuming row below is an instance of
> above mention wrapper class.
> 
> row.field1     # access field1 using __getattr__, name of field is 'field1'
> row._tuple[0]  # access field1 directly via tuple
> row.GetAttribute("field1")  # access via class internal dict.
> 
> If I remember, Jim Fulton proposed something like this long time ago,
> and I've personally implemented this kind of an interface.  Works very
> nicely.  Jim's proposal was more detailed than this quick sketch.
> I suggest you browse past archives for this sig, if those are
> available.
>
> Harri Pasanen

When accessing an mSQL database, I use a similar interface, which I
also find extremely useful.  One difference is that I use the dict
metaphor with attribute access as a shortcut, so row['field1'] and
row.field1 accesses field1 of the row, row.keys() returns the field
names, and row.values() (rather than row._tuple) returns the original
tuple.  What this means is that although you lose the ability to use
attribute access for fields named values, keys, has_key, etc., you
gain the ability to treat a record just like a dictionary if you want
to.

Another layer of abstraction (on top of the API) that I find useful
when doing simple selects on individual tables is the following:

server.keys() =
	list of databases handled by server
server.mydb = server['mydb'] =
	Database representing database mydb

server.mydb.table1 = server.mydb['table1'] = 
	Table object representing table1
server.mydb.keys() = 
	list of table names in database

server.mydb.table1() =
	select * from table1
server.mydb.table1(id=47) =
	select * from table1 where id=47
server.mydb.table1(category='big', user='Fred', date=INCREASING) =
	select * from table1 where category="big" and user="Fred" order by date

and so on, which provide a very compact, yet readable (to me at least
:-), interface to tabular databases for things like CGI script.  I can
use the same interface to access databases stored in flat files as
well.

If you want, the idea can even be extended (although it is a bit more
obscure) to fields if you want:

server.mydb.table1.keys() =
	list of fields in table1
server.mydb.table1.id = server.mydb.table1['id'] =
	Field object representing field id of table table1
server.mydb.table1.user.keys() =
	list of values for field user in table1
server.mydb.table1.user['Fred'] = server.mydb.table1.user.Fred =
	select * from table1 where user="Fred"

As you can see, I am addicted to this Dictionary + Attribute-access
mixed-metaphor.

 David

=================
DB-SIG  - SIG on Tabular Databases in Python

send messages to: db-sig@python.org
administrivia to: db-sig-request@python.org
=================