0

Ich habe die folgende zugeordnete Klasse, die eine Verknüpfung aus 2 anderen Klassen ist.SqlAlchemy Beziehung viele-zu-viele zu einem anderen viele-zu-viele

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) 

Ich möchte es der Klasse Person zuordnen. So wie 1 InstanceCustomer viele Personen haben kann und 1 Person viele Instance-Kunden haben kann, brauche ich eine andere Verbindung zwischen ihnen, wie kann ich das tun? Ist der Primärschlüssel/Fremdschlüssel auch ein Problem?

Hier ist die Klasse Person

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

Antwort

0

eine N: N-Beziehung, benötigen Sie eine Querbeziehungstabelle. Ein Beispiel:

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 als Referenz.

+0

Vielen Dank für Ihre Antwort! Ich habe nur einen Streit, weil InstanceCustomer bereits zwei Primärschlüssel hat, und ich bin nicht in der Lage, damit umzugehen –

+0

Sie müssen diese zwei Fremdschlüssel nicht als Primärschlüssel verwenden. Verwenden Sie eine Autoinkrement-Int-ID als Primärschlüssel. Verwenden Sie den eindeutigen Schlüssel, um sicherzustellen, dass nur ein (a_id, b_id) -Paar vorhanden ist, wenn Sie möchten. – Valens

+0

Also wenn ich dich verstehe (a_id, b_id) sollte nicht ein zusammengesetzter Schlüssel sein, sondern sollte durch einen anderen Primärschlüssel automatisch erhöht werden. aber mein Problem ist, dass InstanceCustomer besteht aus einem zusammengesetzten Primärschlüssel, der in der Kreuz Beziehungstabelle sein sollte. Aber als ich versuche, sie zu importieren, beschwert sich SQLAlchemy über: "Es gibt mehrere Fremdschlüsselpfade, die die Tabelle usw. verbinden ..." Die Nachricht bleibt jedoch bestehen, auch wenn ich der Argumentation das Fremdschlüssel-Argument übergeben habe –

Verwandte Themen