2012-06-15 4 views
7

다른 파일의 관계가있는 테이블을 분리하는 데 문제가 있습니다. 아래의 표를 세 개의 개별 파일로 가져오고 TableA을 타사 페이지로 가져 오려면로드 순서를 관리 할 수 ​​없습니다.SQLAlchemy 관계가있는 테이블 가져 오기

대부분 다음과 같은 오류가 발생합니다.

sqlalchemy.exc.InvalidRequestError : 매퍼 Mapper | TableA | tablea를 초기화 할 때 'TableB'식이 이름을 찾지 못했습니다 ("name 'TableB'이 정의되지 않음). 이 이름이 클래스 인 경우, 두 개의 종속 클래스가 모두 정의 된 후이 관계를() 클래스에 추가하는 것을 고려하십시오.

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) 

답변

3

이 (테이블 순환 모듈 로딩을 방지하기 위해 테이블의 이름으로 대체한다는 TableC 있습니다.) 작동합니다 :

는 또한
### 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) 

내가 믿는 그 외래 키 매개 변수 는 대소 문자를 구별하므로 "TableA.id"는 "tablea"이름과 일치하지 않으므로 코드가 작동하지 않을 수 있습니다.

+1

답 해주세요 : – bozhidarc

+8

관계에서 사용할 수 있도록 수업을 가져와야합니까? –

관련 문제