私はいくつかのタブで複雑なクエリをデフォルトのRowProxy
クラスの代わりにカスタムクラスMyResult
にマッピングするようにsqlalchemyに指示する方法を探しています。今、私はMyResultに結果行からマッピングを実行するためにSQLAlchemyのを指示する方法を探していますクエリの結果をsqlalchemyのカスタムオブジェクトにマップする方法は?
from sqlalchemy import *
from itertools import imap
db = create_engine('sqlite:///test.db')
metadata = MetaData(db)
class MyResult(object):
def __init__(self, id, title, name):
self.id = id
self.title = title
self.name = name
foo = Table('foo', metadata, autoload=True)
bar = Table('bar', metadata, autoload=True)
result = select([foo.c.id, foo.c.title, bar.c.name], foo.c.id == bar.c.foo_id).execute().fetchall()
:ここでは簡単な作業例
'''
create table foo(id integer, title text);
create table bar(id integer, foo_id integer, name text);
insert into foo values(0, 'null');
insert into foo values(1, 'eins');
insert into bar values(0,0, 'nullnull');
insert into bar values(1,0, 'einsnull');
insert into bar values(2,1, 'zweieins');
'''
し、次のコードです。
row = result[0]
print type(row)
#<class 'sqlalchemy.engine.base.RowProxy'>
print row.items()
#[(u'id', 0), (u'title', u'null'), (u'name', u'einsnull')]
私は
my_result = imap(lambda x: MyResult(**x), result)
ようなもので、手でマッピングを行うことができます知っているが、私は、これはSQLAlchemyの中でそれを処理する方法ではないことを感じています。
例は実際には複雑ではありませんが、現実世界の問題は複雑ですか?しかし、これらの2つのテーブルの間には「実際の」関係があります。a)テーブル間には実際には「1-1の関係」があり、2つの結合された行は1つの「オブジェクト」インスタンス(a-la継承)を表します。 b)単一のFooはmay bar( '1-n relationship')によって参照されることができます。この場合、あなたのマッピングはうまくいかず、 'id'カラム(PKとして使われる)は一意ではないかもしれません。 x)はこれらのビューのみですか、新しい 'MyResult'インスタンスを作成して保存することで新しいDB行を追加できますか? – van
現実世界の例は4つのテーブルにわたる結合です。スノーフレークスキーマからの1-n関係。私はIDの問題を認識していますが、結合された一意のIDまたは別の方法でそれを解決できます。インスタンスを保存する必要はありません。 –