【问题标题】:Joining 2 Tables on Multiple Non Foreign Key Columns in Flask with SQLAlchemy and Retrieving All Columns使用 SQLAlchemy 在 Flask 中的多个非外键列上连接 2 个表并检索所有列
【发布时间】:2013-04-11 23:20:12
【问题描述】:

我有一些如下所示的表,我想将它们加入到彼此的表中不是外键的列上,然后可以访问这两个表的列。以下是课程:

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 和行业 ID。这可能吗?这是我为实现此目的而编写的 SQL...

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

【问题讨论】:

    标签: sqlalchemy flask flask-sqlalchemy


    【解决方案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()the SQLAlchemy documentation

    一起使用

    然后,您可以选择使用 virtual 模型:请参阅此问题 Mapping a 'fake' object in SQLAlchemyTokenMacGuy 的答案。 这将是一个很好的解决方案。

    或者您将只有一个 YiYgi 类,它不是 sqlalchemy.Base 派生类,而只是一个对象。它更像是一种“手工时尚”的方式。

    该类将有一个 classmethod get() 方法,该方法将:

    1. 调用您之前构建的查询,
    2. 用返回的请求行调用init,每行建立一个实例

    这是一个例子:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 1970-01-01
      • 2012-09-11
      • 2019-03-09
      • 1970-01-01
      • 2015-02-02
      • 2015-08-27
      • 2013-05-24
      • 2011-11-11
      相关资源
      最近更新 更多