not example python sqlalchemy relationship

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.