1つの汚い方法は次のとおりです。
q=session.query(Ygi,Yi.complexity).\
filter(Yi.year==Ygi.year).\
filter(Yi.industry_id==Ygi.industry_id)
あなたに与える:
SELECT ygi.year AS ygi_year, ygi.geo_id AS ygi_geo_id,
ygi.industry_id AS ygi_industry_id, ygi.wage AS ygi_wage,
yi.complexity AS yi_complexity
FROM ygi, yi
WHERE yi.year = ygi.year
AND yi.industry_id = ygi.industry_id
join() メソッドを使用していないため、これは汚いと思います。join()の使用方法は、SQLAlchemy のドキュメントで確認できます。
次に、仮想モデルの使用を選択できます。この質問のTokenMacGuyの回答を参照してくださいMapping a 'fake' object in SQLAlchemy . それは良い解決策になります。
または、sqlalchemy.Base 派生クラスではなく、単なるオブジェクトであるYiYgi クラスが作成されます。それは「手作り」の方法です。
クラスには、次のことを行う classmethod get() メソッドがあります。
- 直前に作成したクエリを呼び出し、
- 返されたリクエスト行でinitを呼び出し、行ごとに 1 つのインスタンスを構築します
これは例です:
class YiYgi(object):
def __init__(self,year, geo_id, industry_id, wage, complexity):
# Initialize all your fields
self.year = year
self.geo_id = geo_id
self.industry_id = industry_id
self.wage = wage + 100 # You can even make some modifications to the values here
self.complexity = complexity
@classmethod
def get_by_year_and_industry(cls, year, industry_id):
""" Return a list of YiYgi instances, void list if nothing available """
q = session.query(Ygi,Yi.complexity).\
filter(Yi.year==Ygi.year).\
filter(Yi.industry_id==Ygi.industry_id)
results = q.all()
yiygi_list = []
for result in results:
# result is a tuple with (YGi instance, Yi.complexity value)
ygi_result = result[0]
yiygi = YiYgi(ygi_result.ygi_year,
ygi_result.geo_id,
ygi_result.industry_id,
ygi_result.wage,
result[1])
yiygi_list.append(yiygi)
return yiygi_list