SQLAlchemy importar tablas con relaciones

Tengo problemas para separar tablas con relaciones en diferentes archivos. Quiero que las siguientes tablas estén en tres archivos separados e importen TableA en una página de terceros, pero no puedo administrar el orden de carga.

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

sqlalchemy.exc. InvalidRequestError: Al inicializar el asignador Mapper | TableA | tablea, la expresión ‘TableB’ no pudo localizar 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 las dos 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 del módulo circular):

 ### 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” no coincide con el nombre de “tablea” cuando se distingue entre mayúsculas y minúsculas.

 from sqlalchemy import Column, String, Integer from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Parent(Base): __tablename__ = 'Parent' ParentID = Column(Integer, primary_key=True) Description = Column(String) def __init__(self, ParentID, Description): self.ParentID = ParentID self.Description = Description ---------------------------------------------------------------------- from sqlalchemy import Column, String, Integer, ForeignKey import Parent from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Child(Base): __tablename__ = "Child" ChildID = Column(Integer, primary_key=True) Description = Column(String) ParentID = Column('CompanyID', Integer, ForeignKey(Parent.ParentID)) def __init__(self, ChildID, Description,ParentID): self.ChildID = ChildID self.Description = Description self.ParentID=ParentID