2013-04-11 50 views
1

我有幾張如下所示的表,我想加入不是外鍵到對方表的列,然後有權訪問兩個列。下面是類:使用SQLAlchemy和檢索所有列在Flask中的多個非外鍵列上連接2個表

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加入兩個表的列我指定,在這種情況下,新年和industry_id。這可能嗎?下面是我寫來實現這一目標的SQL ...

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

回答

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

然後,您可以選擇使用虛擬模型:看TokenMacGuy的答案在這個問題上Mapping a 'fake' object in SQLAlchemy。 這將是一個很好的解決方案。

,否則將只是有一個YiYgi類不會是一個sqlalchemy.Base派生類,但只是一個對象。它更像是一種「手工製作」的方式。

類將有一個類方法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 
相關問題