2012-06-15 52 views
7

我在使用不同文件中的關係分隔表時遇到了問題。我希望下面的表格位於三個單獨的文件中,並在第三方頁面中導入TableA,但我無法管理加載順序。SQLAlchemy導入帶關係的表

在大多數情況下,我收到以下錯誤。

sqlalchemy.exc。InvalidRequestError:初始化映射器映射器|表A |表時,表達式'表B'找不到名稱(「名稱'表B'未定義」)。如果這是一個類 名稱,請考慮在定義了兩個相關類之後,將此關係()添加到類中。

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

這應該工作(注意,表C 被替換爲表的名稱,以避免循環加載模塊。):

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

此外,我認爲,ForeignKey的參數是區分大小寫的,所以你的代碼可能不起作用,因爲「TableA.id」在區分大小寫的時候會匹配「tablea」的名字。

+1

感謝您的回答:) – bozhidarc

+8

您是否需要導入該類才能在關係中使用它? –