19

When I want to display some data in the web, the data need makeup, and I don't know how to achieve, here is the code:

from sqlalchemy import create_engine

engine = create_engine('mysql://root:111@localhost/test?charset=utf8')
conn = engine.connect()

articles = conn.execute('SELECT * FROM article')
articles = articles.fetchall()

for r in articles:
    r['Tags'] = r['Keywords']

It tips that: 'RowProxy' object does not support item assignment.

What should I do for that?

The table 'article' contains the column 'Keywords', and not contains the column 'Tags'.

Tony
  • 321
  • 1
  • 2
  • 6
  • pluralized in that way, does that mean each article can have more than one tag/keyword? How ever do you store more than one such keyword/tag in a single column? How would query for all of the articles with a particular keyword? – SingleNegationElimination May 14 '12 at 17:53

2 Answers2

31

You can make a dict out of your RowProxy, which would support item assignment.

For example:

result_proxy = query.fetchall()
for row in result_proxy:
    d = dict(row.items())
    d['Tags'] = d['Keywords']
jd.
  • 10,678
  • 3
  • 46
  • 55
5

One nice trick with this is to use a subclass of a dict:

class DBRow(dict):
    def __getattr__(self, key):
        """make values available as attributes"""
        try:
            return self[key]
        except KeyError as error:
            raise AttributeError(str(error))

   @property
   def something_calculated(self):
       return self.a + self.b

row = DBRow(result_proxy_row, additional_value=123)
row["b"] = 2 * row.b
print something_calculated

The benefit of this is, that you can access the values still as attributes, plus you can have properties, which is a nice way to cleanup and massage the data coming from the database.

yacc143
  • 375
  • 4
  • 6