Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQLAlchemy连接烧瓶中多个非外键列上的2个表并检索所有列_Sqlalchemy_Flask_Flask Sqlalchemy - Fatal编程技术网

使用SQLAlchemy连接烧瓶中多个非外键列上的2个表并检索所有列

使用SQLAlchemy连接烧瓶中多个非外键列上的2个表并检索所有列,sqlalchemy,flask,flask-sqlalchemy,Sqlalchemy,Flask,Flask Sqlalchemy,下面显示了一些表,我希望将非外键的列连接到彼此的表,然后访问这两个表的列。以下是课程: 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 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
一种肮脏的方式是:

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()方法。 您可以了解如何将连接()与一起使用

然后,您可以选择使用虚拟模型:请参阅此问题中的答案。 这将是一个很好的解决办法

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

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

  • 调用之前生成的查询
  • 使用返回的请求行调用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
    
    一种肮脏的方式是:

    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()方法。 您可以了解如何将连接()与一起使用

    然后,您可以选择使用虚拟模型:请参阅此问题中的答案。 这将是一个很好的解决办法

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

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

  • 调用之前生成的查询
  • 使用返回的请求行调用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