2017-01-29 2 views
0

Ich arbeite mit sqlalchemy und möchte eine Reihe von Zeilen aus einer Tabelle durchlaufen eine Reihe von berechneten Zeilen hinzufügen und sie in eine zweite Tabelle einfügen. Ich konnte das Zeilenobjekt in ein Wörterbuch konvertieren und verwenden, dass:Der beste Weg, um das Objekt sqlalchemy zu manipulieren

def object_as_dict(obj): 
    return {c.key: getattr(obj, c.key) 
      for c in inspect(obj).mapper.column_attrs} 

for row in session.query(source).limit(50): 

    d = object_as_dict(row) 
    del d['id'] # DON'T FORGET TO REMOVE ID FROM FIRST TABLE FROM DICT 
    item = Filtered_Item() 
    for k in d.keys(): 
     item[k] = d.get(k) 

    item['calc1']=None 
    item['calc2'] = None 

Aber ich frage mich, ob es ein direkterer Weg ist mit einem sqlalchemy Zeilenobjekt zu arbeiten?

+0

ah, vielleicht falsch verstanden ich, Sie fragen, wie Sie dies tun, ohne ein Wörterbuch benutzen? –

+0

danke, ja. – user61629

+0

ist die Antwort, was Sie suchen oder nicht wirklich? –

Antwort

1

Wenn Sie dies ohne Serialisierung tun möchten, können Sie dies versuchen:

for row in session.query(source).limit(50): 
    session.add(models.MyOtherModel(val=foo(row.val),val2=bar(row.bal2)) 

Ich persönlich glaube nicht, dass es etwas falsch ist mit Serialisierung/Deserialisierung der Daten. Ich mache etwa 25 Millionen pro Tag unter Verwendung einer ähnlichen Technik dazu schreibt:

def serialze_sqlalchemy_data(model, items): 
    headers = sqlalchemy_headers(model) 

    for record in items: 
     row = {str(k): str(v) for k, v in 
      zip(headers, [getattr(record, header.lower(), str(header.lower())) for header in headers])} 
     yield row 

def sqlalchemy_headers(model): 
    try: 
     _headers = [col.name for col in model.__mapper__.columns] 
    except AttributeError: 
     _headers = [col for col in model.__dict__.keys() 
        if isinstance(model.__dict__[col], InstrumentedAttribute)] 
    return _headers 

Sie könnten dann so etwas wie:

def foo(row): 
    row['val'] = 'taco' 
    row['val2'] = 42 
    return row 

mymodel = models.MyModel 
rows = session.query(mymodel) 
rowdata = serialize_sqlalchemy_data(mymodel, rows) 

table2 = models.MyModel2 
session.bulk_insert_mappings(tables2, map(foo, rowdata)) 
session.commit() 
session.close() 
Verwandte Themen