1

以下に示すテーブルがいくつかありますが、相互のテーブルへの外部キーではない列で結合し、両方の列にアクセスしたいと考えています。クラスは次のとおりです。

class Yi(db.Model):

    year = db.Column(db.Integer(4), primary_key=True)
    industry_id = db.Column(db.String(5), primary_key=True)
    wage = db.Column(db.Float())
    complexity = db.Column(db.Float())

class Ygi(db.Model, AutoSerialize):

    year = db.Column(db.Integer(4), primary_key=True)
    geo_id = db.Column(db.String(8), primary_key=True)
    industry_id = db.Column(db.String(5), primary_key=True)
    wage = db.Column(db.Float())

したがって、取得したいのは、指定した ID (この場合は Year と industry_id) で結合された両方のテーブルの列です。これは可能ですか?これを達成するために私が書いたSQLは次のとおりです...

SELECT 
    yi.complexity, ygi.* 
FROM
    yi, ygi 
WHERE 
    yi.year = ygi.year and 
    yi.industry_id = ygi.industry_id
4

1 に答える 1

1

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() メソッドがあります。

  1. 直前に作成したクエリを呼び出し、
  2. 返されたリクエスト行で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
于 2013-04-12T11:16:12.377 に答える