2012-06-15 6 views
7

異なるファイルのリレーションシップでテーブルを区切るときに問題があります。下の表を3つの別々のファイルに入れ、サードパーティのページにTableAをインポートしますが、ロード順を管理することはできません。SQLAlchemyリレーションシップを持つテーブルをインポートする

ほとんどの場合、私は次のエラーを受け取ります。

sqlalchemy.exc。InvalidRequestError:Mapper Mapper | TableA | tableaを初期化するときに、式 'TableB'が名前の検索に失敗しました( "名前 '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

この(表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

関係で使用できるようにするには、クラスをインポートする必要がありますか? –

関連する問題