2016-05-31 61 views
0

我有兩個表項和集團用瓶的SQLAlchemy連接到PostgreSQL的數據庫在Python定義:如何使用SQLAlchemy和Flask在兩個表上執行自然連接?

class Entry (db.Model): 
    __tablename__ = "entry" 
    id = db.Column('id', db.Integer, primary_key = True) 
    group_title = db.Column('group_title', db.Unicode, db.ForeignKey('group.group_title')) 
    url = db.Column('url', db.Unicode) 
    next_entry_id = db.Column('next_entry_id', db.Integer, db.ForeignKey('entry.id')) 

    entry = db.relationship('Entry', foreign_keys=next_entry_id) 
    group = db.relationship('Group', foreign_keys=group_title) 

class Group (db.Model): 
    __tablename__ = "group" 
    group_title = db.Column('group_title', db.Unicode, primary_key = True) 
    group_start_id = db.Column('group_start_id', db.Integer) 
    #etc. 

我想這兩個表與自然的結合使用Entry.idGroup.group_start_id作爲公共領域的加盟。

我已經能夠查詢所有記錄的單個表。但我想通過外鍵ID連接表,將Group.group_start_idGroup.group_title的記錄記錄到特定的Entry記錄中。

我有

我曾嘗試多種方法砂箱SQLAlchemy的查詢語法或過程中遇到問題(列出幾個):

db.session.query(Group, Entry.id).all()

db.session.query(Entry, Group).all()

db.session.query.join(Group).first()

db.session.query(Entry, Group).join(Group)

它們都返回了大於預期的元組列表,並且不包含我想要的元組。 我在尋找以下結果: (Entry.id, group_title, Group.group_start_id, Entry.url)

我將不勝感激任何幫助。

回答

1

great article用下面的查詢來執行一個天然成因加入了集團和項目表: db.session.query(Entry, Group).join(Group).filter(Group.group_start_id == Entry.id).order_by(Group.order.asc())

我這樣做是使用.join功能在我的查詢這讓我加入本集團表到t他入口表。然後,我通過使用Group.group_start_id過濾查詢的結果,這是組表中的一個外鍵,該表中引用Entry.id這是Entry表中的主鍵。

0

由於您已通過使用relationship()調用執行了基本連接。 我們可以專注於獲得你想要的數據,查詢等(Entry, Group)類型的db.session.query(Entry, Group).all()回報的元組,這個,你可以很容易地做一些事情,如:

test = db.session.query(Entry, Group).one() 
print(test[0].id)    #prints entry.id 
print(test[1].group_start_id) # prints Group.group_start_id 
#... 

SQLAlchemy的對連接的工作原理

+0

感謝您的建議!不幸的是,這並不是我正在尋找的。使用pgAdmin中的查詢工具,我可以使用此查詢來獲取我正在查找的表:select * from「group」join「entry」on「group」.group_start_id =「entry」.id;'。我怎樣才能使用SQLAlchemy模型系統來運行?我能夠通過'db.engine.execute'運行原始查詢,並得到我想要的結果,但是它是一個元組而不是字典樣式對象,因爲它是首選。 –

+0

我寫的示例代碼不工作嗎?還是有其他問題嗎? –

相關問題