2012-06-15 25 views
7

मुझे विभिन्न फ़ाइलों में संबंधों के साथ तालिकाओं को अलग करने में समस्या है। मैं नीचे दी गई सारणी को तीन अलग-अलग फाइलों में रखना चाहता हूं और तीसरे पक्ष के पृष्ठ में तालिका ए आयात करना चाहता हूं, लेकिन मैं लोड ऑर्डर का प्रबंधन नहीं कर सकता।संबंधों के साथ SQLAlchemy आयात तालिका

अधिकांश समय में मुझे निम्न त्रुटि मिल रही है।

sqlalchemy.exc।अमान्य RequestError: मैपर मैपर प्रारंभ करते समय | 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

यह काम करना चाहिए (ध्यान दें कि 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) 

इसके अलावा मुझे विश्वास है कि ForeignKey पैरामीटर मामला संवेदनशील है, इसलिए आप कोड काम नहीं कर सकते क्योंकि "TableA.id" doe snot match "tablea" नाम केस-संवेदी है।

+1

answear के लिए धन्यवाद :) – bozhidarc

+8

क्या आपको किसी रिश्ते में इसका उपयोग करने में सक्षम होने के लिए कक्षा आयात करना है? –

संबंधित मुद्दे