[Python] How to reuse the join alias made before on other relationship into an other...

Discussão em 'Python' iniciado por Stack, Agosto 5, 2025.

  1. Stack

    Stack Membro Participativo

    I have a model with these attributes:

    class VInterlocutori(Base):
    __tablename__ = 'v_interlocutori'

    origine: Mapped[str] = mapped_column(String(10), nullable=False, primary_key=True)
    origine_id: Mapped[str] = mapped_column(Integer, nullable=False, primary_key=True)
    descrizione: Mapped[str] = mapped_column(String(50), nullable=False)
    descrizione_breve: Mapped[str] = mapped_column(String(25), nullable=False)
    .
    .
    .


    class Causali(Base):
    __tablename__ = 'causali'

    id: Mapped[int] = mapped_column(Integer, nullable=False, primary_key=True)
    descrizione: Mapped[str] = mapped_column(String(50), nullable=False)
    valoremax: Mapped[Decimal] = mapped_column(Numeric(8, 3), nullable=False, default=0)
    costomax: Mapped[Decimal] = mapped_column(Numeric(8, 3), nullable=False, default=0)
    numeratore: Mapped[int] = mapped_column(Integer, nullable=False, default=1)
    origineinterlocutore: Mapped[str] = mapped_column(String(10), nullable=False)
    .
    .
    .

    class ListeTestata(Base):
    __tablename__ = 'liste_testata'

    id: Mapped[int] = mapped_column(Integer, nullable=False, primary_key=True)
    idcausale: Mapped[int] = mapped_column(Integer, ForeignKey(Causali.id), nullable=False)
    idinterlocutore: Mapped[int] = mapped_column(Integer, ForeignKey(VInterlocutori.origine_id), nullable=False)
    origine: Mapped[str] = mapped_column(String(3), ForeignKey(VNegoziMagazzini.cod_negozio), nullable=False)
    datacreazione: Mapped[datetime] = mapped_column(DateTime, nullable=False, default=func.now())

    causale: Mapped[Causali] = relationship(Causali, lazy="joined")
    interlocutore: Mapped[VInterlocutori] = relationship(VInterlocutori, lazy="joined",
    primaryjoin=and_(idinterlocutore ==
    foreign(VInterlocutori.origine_id),
    foreign(Causali.origineinterlocutore) ==
    VInterlocutori.origine)
    )


    On my fastapi route I execute this query:

    @app.route(/)
    def get_liste(db: Session):
    try:
    qry_liste = select(ListeTestata).where(ListeTesta.id == 2)
    rcds_liste = db.execute(qry_liste)
    except SQLAlchemyError as e:
    log.logger(e)
    raise HTTPException(500, "Internal error")
    else:
    return rods_liste


    but when sqlalchemy creates the query, the result is:

    SELECT listearticoli.liste_testata.id,
    listearticoli.liste_testata.idcausale,
    listearticoli.liste_testata.idinterlocutore,
    listearticoli.liste_testata.origine,
    listearticoli.liste_testata.datacreazione,
    listearticoli.liste_testata.stato,
    listearticoli.liste_testata.idcalendario,
    listearticoli.liste_testata.identificativo,
    listearticoli.liste_testata.idzona,
    listearticoli.liste_testata.idcategoria,
    listearticoli.liste_testata.idrepartodes,
    v_interlocutori_1.origine AS origine_2,
    v_interlocutori_1.origine_id,
    v_interlocutori_1.descrizione AS descrizione_2,
    v_interlocutori_1.descrizione_breve,
    v_interlocutori_1.indirizzo,
    v_interlocutori_1.cap,
    v_interlocutori_1.comune,
    v_interlocutori_1.provincia,
    v_interlocutori_1.codice_fiscale,
    v_interlocutori_1.partita_iva,
    v_interlocutori_1.active,
    v_interlocutori_1.info_agg_01,
    v_interlocutori_1.info_agg_02,
    v_interlocutori_1.reso_diretto,
    FROM listearticoli.liste_testata
    LEFT OUTER JOIN ods.v_negozi_magazzini AS v_negozi_magazzini_1
    ON v_negozi_magazzini_1.cod_negozio = listearticoli.liste_testata.origine
    LEFT OUTER JOIN listearticoli.causali AS causali_1 ON causali_1.id = listearticoli.liste_testata.idcausale
    LEFT OUTER JOIN ods.v_interlocutori AS v_interlocutori_1
    ON v_interlocutori_1.origine_id = listearticoli.liste_testata.idinterlocutore AND listearticoli.causali.origineinterlocutore = v_interlocutori_1.origine
    where listearticoli.liste_testata = 2


    You can see the join v_interlocutore sqlalchemy doesn't use the alias causali_1 but directly uses the listearticoli.liste_testata.

    The correct query when sqlalchemy make the left outer join of the relationship VIinterlocutori should be:

    SELECT listearticoli.liste_testata.id,
    listearticoli.liste_testata.idcausale,
    listearticoli.liste_testata.idinterlocutore,
    listearticoli.liste_testata.origine,
    listearticoli.liste_testata.datacreazione,
    listearticoli.liste_testata.stato,
    listearticoli.liste_testata.idcalendario,
    listearticoli.liste_testata.identificativo,
    listearticoli.liste_testata.idzona,
    listearticoli.liste_testata.idcategoria,
    listearticoli.liste_testata.idrepartodes,
    v_interlocutori_1.origine AS origine_2,
    v_interlocutori_1.origine_id,
    v_interlocutori_1.descrizione AS descrizione_2,
    v_interlocutori_1.descrizione_breve,
    v_interlocutori_1.indirizzo,
    v_interlocutori_1.cap,
    v_interlocutori_1.comune,
    v_interlocutori_1.provincia,
    v_interlocutori_1.codice_fiscale,
    v_interlocutori_1.partita_iva,
    v_interlocutori_1.active,
    v_interlocutori_1.info_agg_01,
    v_interlocutori_1.info_agg_02,
    v_interlocutori_1.reso_diretto,
    FROM listearticoli.liste_testata
    LEFT OUTER JOIN ods.v_negozi_magazzini AS v_negozi_magazzini_1
    ON v_negozi_magazzini_1.cod_negozio = listearticoli.liste_testata.origine
    LEFT OUTER JOIN listearticoli.causali AS causali_1 ON causali_1.id = listearticoli.liste_testata.idcausale
    LEFT OUTER JOIN ods.v_interlocutori AS v_interlocutori_1
    ON v_interlocutori_1.origine_id = listearticoli.liste_testata.idinterlocutore AND
    causali_1.origineinterlocutore = v_interlocutori_1.origine
    WHERE listearticoli.liste_testata = 2


    Is there a way to force sqlalchemy to use the already created alias causali_1 to the relationship of interlocutore in ListeTestata model?

    I tried to create an aliased with causali but it didn't work. Can someone help me?

    Continue reading...

Compartilhe esta Página