In order to improve readability in my code I want to use plain words instead index numbers, when creating JSON object:
this is my database table school_subjects:
mysql> DESCRIBE school_subjects;
+------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(500) | NO | | NULL | |
| user_id | int(11) | NO | MUL | NULL | |
| created_by | varchar(64) | NO | | NULL | |
| created_time | datetime | NO | | NULL | |
| num_of_followers | int(11) | NO | | NULL | |
+------------------+--------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
mysql>
my python code:
serg@serg-PORTEGE-Z835:~$ python
Python 2.7.2+ (default, Oct 4 2011, 20:03:08)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import simplejson as json
>>> import MySQLdb
>>> import collections
>>>
>>> mydb = MySQLdb.connect(host='localhost', user='root', passwd='', db='schooldb')
>>> cursor = mydb.cursor()
>>> cursor.execute("""
... SELECT id, name
... FROM school_subjects
... """)
6L
>>> rows = cursor.fetchall()
>>> result = []
>>> for row in rows:
... d = dict()
... d['id'] = row.id #I want something similar to this
... d['name'] = row.name #but it doesn't work
... result.append(d)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: 'tuple' object has no attribute 'id'
as you can see I'm getting this error:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: 'tuple' object has no attribute 'id'
however this code works fine:
>>> result = []
>>> for row in rows:
... d = dict()
... d['id'] = row[0]
... d['name'] = row[1]
... result.append(d)
...
>>> subjects = json.dumps(result, indent=4)
>>> print subjects
[
{
"id": 1,
"name": "Math 140"
},
{
"id": 2,
"name": "English 102"
},
{
"id": 3,
"name": "CS 240"
},
{
"id": 4,
"name": "CS 210"
},
{
"id": 5,
"name": "Math 140"
},
{
"id": 6,
"name": "English 102"
}
]
>>>
The cursor
object has a .description
attribute that tells you the names of each column, use that to turn a row into a dict:
cursor.execute("""
SELECT id, name
FROM school_subjects
""")
columns = [desc[0] for desc in cursor.description]
result = []
rows = cursor.fetchall()
for row in rows:
row = dict(zip(columns, row))
result.append(row)
For details on the .description
attribute, see the Python DB API 2.0 specification.