2012-05-14 1 views
11

Wenn ich einige Daten im Web angezeigt werden sollen, werden die Daten Make-up brauchen, und ich weiß nicht, wie, hier zu erreichen, ist der Code:Kann ich Werte in RowProxy mithilfe von sqlalchemy zuweisen?

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

Es Tipps, die: ‚RowProxy‘ Objekt nicht Artikelzuordnung unterstützen.

Was soll ich dafür tun?

Die Tabelle 'Artikel' enthält die Spalte 'Schlüsselwörter' und enthält nicht die Spalte 'Tags'.

+0

Pluralisiert auf diese Weise, bedeutet das, dass jeder Artikel mehr als ein Tag/Schlüsselwort haben kann? Wie auch immer speichern Sie mehr als ein solches Keyword/Tag in einer einzelnen Spalte? Wie würde nach allen Artikeln mit einem bestimmten Keyword abgefragt? – SingleNegationElimination

Antwort

17

Sie können ein RictProxy-Diktat erstellen, das die Zuweisung von Elementen unterstützt.

Zum Beispiel:

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

Es funktioniert, Danke. – Tony

+3

Nur ein Heads-Up, das 'dict (row) 'auch das selbe Ergebnis liefert. – Jir

1

Ein netter Trick dabei ist, eine Unterklasse eines dict zu verwenden:

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 

Der Vorteil davon ist, dass Sie die Werte nach wie vor als Attribut zugreifen können Außerdem können Sie Eigenschaften haben, was eine gute Möglichkeit ist, die Daten, die aus der Datenbank kommen, zu bereinigen und zu massieren.