2017-01-29 9 views
0

私はsqlalchemyを使用しており、テーブルから一連の行をループして、2つの計算された行を追加し、2番目のテーブルに挿入します。私は辞書に行オブジェクトを変換し、それを使用することができます。sqlalchemyオブジェクトを操作するための最良の方法

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 

しかし、SQLAlchemyの行オブジェクトで動作するように、より直接的な方法がある場合、私は思ったんだけど?

+0

ああ、多分私は誤解、あなたがなく、これを行う方法を求めている私は、約25万人がこれに類似の技術を使用して一日を書き込みません辞書を使って? –

+0

ありがとうございます。 – user61629

+0

はあなたが探しているかどうかの答えですか? –

答えて

1

あなたはシリアライズすることなく、これを実行したい場合、あなたはこれを試みる場合があります:

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

個人的に私は、データをデシリアライズ/シリアライズに何か問題があるとは思いません。

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 

はそのあとのようなもの行うことができます:

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() 
関連する問題