2012-06-15 28 views
7

Tengo un problema con la separación de tablas con relaciones en diferentes archivos. Quiero que las siguientes tablas estén en tres archivos separados e importar TableA en una página de terceros, pero no puedo administrar el orden de carga.Tablas de importación SQLAlchemy con relaciones

En la mayoría de las veces recibo el siguiente error.

sqlalchemy.exc.InvalidRequestError: Al inicializar mapper Mapper | TableA | tablea, la expresión 'TableB' no pudo ubicar un nombre ("nombre 'TableB' no está definido"). Si este es un nombre de clase , considere agregar esta relación() a la clase después de que se hayan definido ambas clases dependientes.

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) 

Respuesta

3

Esto debería funcionar (tenga en cuenta que el TableC mesa se reemplaza por el nombre de la tabla para evitar circular carga de módulos.):

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

También creo que el parámetro ForeignKey distingue entre mayúsculas y minúsculas, por lo que su código podría no funcionar porque "TableA.id" no coincide con el nombre "tablea" cuando distingue entre mayúsculas y minúsculas.

+1

Gracias por la respuesta :) – bozhidarc

+8

¿Tiene que importar la clase para poder usarla en una relación? –

Cuestiones relacionadas