2012-09-01 110 views
0

在SQLAlchemy中,我想編寫一套表A的記錄然後在表BI想寫一個紀錄A.引用了(先前)未知數量的記錄SQLAlchemy的多個外鍵

用python來說,我會創建類A和B,然後在B中包含一個包含A類對象的列表。

可以這樣做嗎?

+0

歡迎來到Stack Overflow!我們鼓勵你[研究你的問題](http://stackoverflow.com/questions/how-to-ask)。如果你已經[嘗試了某些東西](http://whathaveyoutried.com/),請將其添加到問題中 - 如果沒有,請先研究並嘗試您的問題,然後再回來。 – 2012-09-27 16:26:17

回答

1

這不是一個真正的SQLAlchemy問題,而是一個基本的關係表問題。

您不是在談論一對多的關係,或者是多對多的關係,SQLAlchemy都支持開箱即用的關係。

一一對多

一個一對多的關係是基本遏制之一;一個部門有很多員工,但每個員工只有一個部門。在這種情況下,只有一個外出關係的類獲得外鍵,因此員工引用了部門,而不是相反。

example from the SQLAlchemy documentation給出如下:

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 
    children = relationship("Child") 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Integer, ForeignKey('parent.id')) 

因此,如果您A類只能是一個B集的一部分,使用這種模式。

許多一對多

一個多一對多的關係是一個雙方都可以參考對方的多個實例。想想員工和項目;一名員工可以成爲多個項目的一部分,而一個項目可能涉及多名員工。

在SQL中,這種關係需要一個關聯表,一個額外的數據庫表,用於存放兩個鏈接類型之間的映射。 SQLAlchemy documentation on many-to-many relationships文件清楚如何做到這一點;這裏是例如:

association_table = Table('association', Base.metadata, 
    Column('left_id', Integer, ForeignKey('left.id')), 
    Column('right_id', Integer, ForeignKey('right.id')) 
) 

class Parent(Base): 
    __tablename__ = 'left' 
    id = Column(Integer, primary_key=True) 
    children = relationship("Child", 
        secondary=association_table) 

class Child(Base): 
    __tablename__ = 'right' 
    id = Column(Integer, primary_key=True) 

使用此圖案如果每個A對象可以是多於一個的B集的一部分。

+0

在發佈問題之前,我實際上閱讀了這篇文章,但我回過頭再讀一遍。我仍然不明白這將如何工作。這association_table讓我有許多1對1的關係,當你總體看他們是我猜想的一種多對多關係。但不是我想要的那種(這是一個從Child到Parent的可變長度的ForeignKeys列表,我想我可以將ID存儲在一個二進制塊中... –

+0

@ArewrewStone:這就是關係規範化的工作方式。爲你尋找可變長度的外鍵搜索'多對多'和'sql'並閱讀這個概念;這不僅僅限於SQLAlchemy單獨使用 –

+0

@ArewrewStone:這樣看:如果你想查詢關聯表的所有關係,其中TypeB_id =「foobar」,你會得到一個有限的行列表,每一行都是一個TypeA項目的ID,長度可變,這就是數據庫如何有效地存儲這些關係。 –