2012-06-15 13 views
7

Ho problemi con la separazione di tabelle con relazioni in file diversi. Voglio che le seguenti tabelle siano in tre file separati e che importi TableA nella pagina di terze parti, ma non riesco a gestire l'ordine di caricamento.SQLAlchemy importazione tabelle con relazioni

Nella maggior parte delle volte ricevo il seguente errore.

sqlalchemy.exc.InvalidRequestError: durante l'inizializzazione del mappatore mapper | TableA | tablea, espressione 'TableB' non è riuscito a individuare un nome ("nome 'TableB' non è definito"). Se si tratta di un nome di classe , considerare l'aggiunta di questa relazione() alla classe dopo che sono state definite entrambe le classi dipendenti.

class TableA(Base): 
    __tablename__ = "tablea" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 

    tableB = relationship("TableB", secondary = TableC.__table__) 

class TableB(Base): 
    __tablename__ = "tableb" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 

class TableC(Base): 
    __tablename__ = "tableab" 
    tableAId = Column("table_a_id", Integer, ForeignKey("TableA.id"), primary_key=True) 
    tableBId = Column("table_b_id", Integer, ForeignKey("TableB.id"), primary_key=True) 

risposta

3

Questo dovrebbe funzionare (notare che il TableC tavolo viene sostituito con il nome della tabella per evitare circolare caricamento del modulo.):

### base.py 
engine = create_engine('sqlite:///:memory:', echo=True) 
Session = sessionmaker(bind=engine) 
Base = declarative_base(bind=engine) 

### classA.py 
from base import Base 
from classB import TableB 

class TableA(Base): 
    __tablename__ = 'tablea' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 
    tableBs = relationship("TableB", secondary="tableab") 
    #tableBs = relationship("TableB", secondary=TableC.__table__) 

### classB.py 
from base import Base 

class TableB(Base): 
    __tablename__ = 'tableb' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 

### classC.py 
from base import Base 
from classA import TableA 
from classB import TableB 

class TableC(Base): 
    __tablename__ = 'tableab' 
    tableAId = Column(Integer, ForeignKey("tablea.id"), primary_key=True,) 
    tableBId = Column(Integer, ForeignKey("tableb.id"), primary_key=True,) 

### main.py 
from base import Base, Session, engine 
from classA import TableA 
from classB import TableB 
from classC import TableC 
Base.metadata.create_all(engine) 

Inoltre ritengo che il parametro ForeignKey fa distinzione tra maiuscole e minuscole, quindi il codice potrebbe non funzionare perché il nome "tablea" di "TableA.id" snot corrisponde alla distinzione tra maiuscole e minuscole.

+1

Grazie per la risposta :) – bozhidarc

+8

È necessario importare la classe per poterla utilizzare in una relazione? –

Problemi correlati