0

我有以下映射類,它是來自其他兩個類的關聯。SqlAlchemy關係多對多與其他多對多關係

class InstanceCustomer(Base): 
__tablename__ = 'Instances_Customers_Association' 

cust_id = Column(Integer, ForeignKey('Customers.id'), primary_key=True) 
inst_id = Column(Integer, ForeignKey('Instances.id'), primary_key=True) 

customer = relationship(Customer, backref=backref('customer')) 
instance = relationship(Instance, backref=backref('instance')) 

def __init__(self, cust_id=None, inst_id=None): 
    self.cust_id = cust_id 
    self.inst_id = inst_id 

def __repr__(self): 
    return "<InstanceCustomer(cust_id='%s', inst_id='%s')>" % (self.cust_id, self.inst_id) 

我想將它關聯到Person類。因此,如1 InstanceCustomer可以有很多Person和1 Person可以有很多Instance Customer,我需要他們之間的其他關聯,我該怎麼做?主鍵/外鍵是否也是一個問題?

這裏是Person類

class Person(Base): 
     __tablename__ = 'person' 
     id = Column(Integer, primary_key=True) 

回答

0

是一個N:N的關係,你需要一個交叉關係表。舉例:

Class A(Base): 
    id = Column(Integer, primary_key=True) 

Class B(Base): 
    id = Column(Integer, primary_key=True) 
    As = relationship(
     'A', 
     secondary=AnB, 
     backref=backref('Bs') 
    ) 

AnB = Table(
    "table_a_to_b", 
    Base.metadata, 
    Column(
     'a_id', 
     Integer, 
     ForeignKey('A.id') 
    ), 
    Column(
     'b_id', 
     Integer, 
     ForeignKey('B.id') 
    ) 
) 

Sqlalchemy doc供參考。

+0

謝謝你的回答!我只是因爲InstanceCustomer已經有兩個主鍵而掙扎,我無法處理這個問題 –

+0

您不需要將這兩個外鍵用作主鍵。使用自動增量int id作爲主鍵。如果需要,使用唯一鍵確保只有一個(a_id,b_id)對。 – Valens

+0

所以,如果我不理解你(a_id,b_id)不應該是一個組合鍵,但應該由另一個主鍵自動增加識別。 但我的問題是,InstanceCustomer由組成的主鍵,它應該在交叉關係表中。但是,當我試圖導入它們時,SQLAlchemy正在抱怨:「有多個外鍵路徑鏈接表等,」但即使我提供了關係foreign_key參數的消息仍然存在 –