MySQLdb DictCursor scrambles field order

HW google at thegoldensun.com
Thu Aug 1 02:58:25 EDT 2002


"Chris Gonnerman" <chris.gonnerman at newcenturycomputers.net> wrote in message news:<mailman.1028093265.3963.python-list at python.org>...
> ----- Original Message ----- 
> From: "HW" <google at thegoldensun.com>
> 
> 
> > Hello,
> > 
> > I am viewing some MySQL tables via Python CGI; I use the
> > MySQLdb.DictCursor in order to return the field names as well as the
> > data, so I can output a table with the field names as column headings.
> > 
> > Unfortunately, the DictCursor seems to scramble the order of fields,
> > eg:
> > "SELECT field1, field2, field3 FROM table"
> > which returns the fields in order when using a standard cursor, seems
> > to rearrange the order (randomly?) with a DictCursor.
> 
> What else did you expect?  The fields are returned in the form of a 
> mapping, which has no required or inate order to it.  It's a hash.
> 
> Again, why do you care?  

I care because I am returning the results of an arbitrary
(user-specified) query. I have considered parsing the SELECT clause of
their SQL query, and generating a list of keys from this, as you
suggest, but some of the SELECT clauses are ...a little complex, as in
the sample below:

"""
select
    DECODE(admin_personName.givenName, "%(key)s") as givenName,
    DECODE(admin_personName.familyName, "%(key)s") as familyName,

    admin_ktName.description AS knowledgeTrack,
    admin_ktPath.name AS Path,
    admin_ktRelease.ktVersion AS Version,
    admin_videoFormat.name as videoFormat,

    admin_ktRegistration.dayPurchased AS Day,
    admin_ktRegistration.monthPurchased AS Month,
    admin_ktRegistration.yearPurchased AS Year,

    DECODE(processedByName.givenName, "%(key)s") AS processorGiven,
    DECODE(processedByName.familyName, "%(key)s") AS processorFamily,

    DECODE(admin_personEmail.email, "%(key)s") AS email,
    admin_emailList.description AS emailLists,

    DECODE(admin_personAddress.address, "%(key)s") AS address,
    city,
    state,
    postcode,
    atlas_countries.name AS country,

    admin_personBirthDate.*,
    admin_ktRegistration.lastUpdated,
    admin_ktRegistration.ktAgreementId
from
    ...[snip]
"""

...Cerainly possible, but this is why I'm asking if there is a simpler
way.

-HW


> Are you iterating over the fields using the 
> record's .keys() method?  Keep track of the keys in a list if you need 
> a specific order:
> 
>     keys = [ "field1", "field2", "field3" ]
> 
>     recs = cursor.fetchall()
> 
>     for record in recs:
>         for key in keys:
>             print "%s: %s" % (key, record[key])
> 
> (sloppy example I know...  hacked it out in a hurry.)
> 
> > I am using MySQLdb 0.9.1, Python 2.1, 3.23.51-nt under Win XP; I have
> > had the same trouble in a similarly numbered Linux version.
> > 
> > Thanks for any help!
> > 
> > HW
> 
> Chris Gonnerman -- chris.gonnerman at newcenturycomputers.net
> http://newcenturycomputers.net



More information about the Python-list mailing list