2012-05-14 20 views
11

Cuando quiero mostrar algunos datos en la web, los datos necesitan maquillaje, y no saben cómo lograr, aquí está el código:¿Puedo asignar valores en RowProxy usando sqlalchemy?

from sqlalchemy import create_engine 

engine = create_engine('mysql://root:[email protected]/test?charset=utf8') 
conn = engine.connect() 

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

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

It consejos que: objeto 'RowProxy' no lo hace asignación de artículos de apoyo.

¿Qué debo hacer para eso?

La tabla 'artículo' contiene la columna 'Palabras clave', y no contiene la columna 'Etiquetas'.

+0

pluralizado de esa manera, ¿significa eso que cada artículo puede tener más de una etiqueta/palabra clave? ¿Cómo almacena más de una palabra clave/etiqueta en una sola columna? ¿Cómo consultar para todos los artículos con una palabra clave en particular? – SingleNegationElimination

Respuesta

17

Puede hacer un dict de su RowProxy, que admitiría la asignación de elementos.

Por ejemplo:

result_proxy = query.fetchall() 
for row in result_proxy: 
    d = dict(row.items()) 
    d['Tags'] = d['Keywords'] 
+0

Funciona, gracias. – Tony

+3

Solo un aviso previo que 'dict (row)' arroja el mismo resultado, también. – Jir

1

Un buen truco con esto es utilizar una subclase de un diccionario:

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 

La ventaja de esto es, que se puede acceder a los valores todavía como atributos Además, puede tener propiedades, que es una buena forma de limpiar y dar masajes a los datos que provienen de la base de datos.

Cuestiones relacionadas