2012-06-15 44 views
7

Tôi gặp vấn đề với việc tách bảng với các mối quan hệ trong các tệp khác nhau. Tôi muốn các bảng bên dưới nằm trong ba tệp riêng biệt và nhập TableA trong trang của bên thứ ba, nhưng tôi không thể quản lý thứ tự tải.SQLAlchemy nhập bảng với các mối quan hệ

Trong hầu hết thời gian tôi nhận được lỗi sau.

sqlalchemy.exc.InvalidRequestError: Khi khởi tạo Mapper Mapper | TableA | tablea, biểu thức 'TableB' không tìm được tên ("name 'TableB' không được định nghĩa"). Nếu đây là tên lớp , hãy xem xét thêm mối quan hệ này() vào lớp sau khi cả hai lớp phụ thuộc đã được xác định.

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) 

Trả lời

3

này nên làm việc (lưu ý TableC bảng được thay thế bằng tên của bảng để tránh nạp mô-đun hình tròn.):

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

Ngoài ra tôi tin rằng các tham số ForeignKey phân biệt chữ hoa chữ thường, vì vậy mã của bạn có thể không hoạt động vì "TableA.id" doe snot khớp với tên "tablea" khi phân biệt chữ hoa chữ thường.

+1

Cảm ơn bạn đã trả lời :) – bozhidarc

+8

Bạn có phải nhập lớp học để có thể sử dụng nó trong mối quan hệ không? –

Các vấn đề liên quan