Tony
Tony

Reputation: 321

Can I assign values in RowProxy using the sqlalchemy?

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'.

Upvotes: 19

Views: 14453

Answers (2)

yacc143
yacc143

Reputation: 385

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.

Upvotes: 5

jd.
jd.

Reputation: 10958

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']

Upvotes: 31

Related Questions