2012-06-15 10 views
7

Mam problem z oddzielaniem tabel od relacji w różnych plikach. Chcę, aby poniższe tabele znajdowały się w trzech osobnych plikach i aby importować TableA na stronie innej firmy, ale nie mogę zarządzać kolejnością ładowania.Tabele importu SQLAlchemy ze związkami

W większość czasu jestem otrzymaniu następujący błąd.

sqlalchemy.exc.InvalidRequestError: Podczas inicjowania odwzorowujący Mapper | TABLEA | TABLEA, wyrażenie 'TableB' nie udało się zlokalizować nazwę ("name 'TableB' nie jest zdefiniowane"). Jeśli jest to nazwa klasy , rozważ dodanie tej zależności() do klasy po zdefiniowaniu obu klas zależnych.

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) 

Odpowiedz

3

To powinno działać (zauważ, że TableC stół otrzymuje z nazwą tabeli, aby uniknąć okrągły moduł załadunku.):

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

Również wierzę, że parametr ForeignKey rozróżnia małe i wielkie litery, więc kod może nie działać, ponieważ "TableA.id" nie pasuje do nazwy "tablea", gdy rozróżniana jest wielkość liter.

+1

Dzięki za answear :) – bozhidarc

+8

Czy trzeba zaimportować klasę, aby móc używać go w związku? –