2016-06-14 7 views

Antwort

14

Anstelle der Definition von "Schema" Ebene ForeignKey Constraints erstellen Sie eine custom foreign condition; Übergeben Sie die Spalten, die Sie als "Fremdschlüssel" verwenden möchten, und die primaryjoin an relationship. Sie müssen manuell die primaryjoin weil definieren:

Standardmäßig ist dieser Wert berechnet wird, basierend auf den Fremdschlüsselbeziehungen der Eltern-Kind-Tabellen (oder Zuordnungstabelle).

In [2]: class A(Base): 
    ...:  a_id = Column(Integer, primary_key=True) 
    ...:  __tablename__ = 'a' 
    ...:  

In [3]: class C(Base): 
    ...:  c_id = Column(Integer, primary_key=True) 
    ...:  a_id = Column(Integer) 
    ...:  __tablename__ = 'c' 
    ...:  a = relationship('A', foreign_keys=[a_id], 
    ...:      primaryjoin='A.a_id == C.a_id') 
    ...:  

Fremdschlüssel kann auch inline in der primaryjoinforeign() mit Anmerkungen versehen werden:

a = relationship('A', primaryjoin='foreign(C.a_id) == A.a_id') 

Sie können überprüfen, dass keine FOREIGN KEY Einschränkungen für Tabellen emittiert werden c:

In [4]: from sqlalchemy.schema import CreateTable 

In [5]: print(CreateTable(A.__table__)) 

CREATE TABLE a (
     a_id INTEGER NOT NULL, 
     PRIMARY KEY (a_id) 
) 



In [6]: print(CreateTable(C.__table__)) 

CREATE TABLE c (
     c_id INTEGER NOT NULL, 
     a_id INTEGER, 
     PRIMARY KEY (c_id) 
) 

Warnung:

Beachten Sie, dass ohne eine FOREIGN KEY Constraint an Ort und Stelle auf der DB-Seite können Sie Ihre referentielle Integrität in Stücke jeder Art, wie Sie wollen. Es gibt eine Beziehung auf ORM-/Anwendungsebene, die jedoch in der Datenbank nicht erzwungen werden kann.

Verwandte Themen