python - example - SQLAlchemy tablas de importación con relaciones
sqlalchemy relationship not null (1)
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 gestionar el orden de carga.
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)
Esto debería funcionar (tenga en cuenta que la tabla TableC. Se reemplaza con el nombre de la tabla para evitar la carga circular del módulo):
### 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 es posible que el código no funcione porque "TableA.id" hace coincidir el nombre "tablea" cuando distingue entre mayúsculas y minúsculas.