2012-06-15 7 views
7

Ich habe Probleme mit dem Trennen von Tabellen mit Beziehungen in verschiedenen Dateien. Ich möchte, dass die Tabellen in drei separaten Dateien vorliegen und TableA auf der Seite von Drittanbietern importieren, aber ich kann die Ladereihenfolge nicht verwalten.SQLAlchemy importieren Tabellen mit Beziehungen

In den meisten Zeit bekomme ich den folgenden Fehler.

sqlalchemy.exc.InvalidRequestError: Beim Initialisieren des Mappers Mapper | TableA | tablea konnte der Ausdruck 'TableB' keinen Namen finden ("name 'TableB' ist nicht definiert"). Wenn dies ein Name der Klasse ist, sollten Sie in Erwägung ziehen, diese relation() zur Klasse hinzuzufügen, nachdem beide abhängigen Klassen definiert wurden.

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) 

Antwort

3

Dies sollte funktionieren (beachten Sie, dass die TableC Tabelle mit dem Namen der Tabelle ersetzt Kreismodul Belastung zu vermeiden.):

### 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) 

auch, dass der ForeignKey Parameter Ich glaube, Groß- und Kleinschreibung ist zu beachten, daher funktioniert der Code möglicherweise nicht, weil "TableA.id" bei der Unterscheidung zwischen Groß- und Kleinschreibung "snot" mit dem Namen "tablea" übereinstimmt.

+1

Danke für die Answear :) – bozhidarc

+8

Müssen Sie die Klasse importieren, um es in einer Beziehung zu verwenden? –