Session.merge_all() does not suppress autoflush during merge cascade, unlike Session.merge()
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
- #13716 di @Huang-404-Q — chiusa senza merge
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 74/100
Direzione di ricerca
Parti da Session.merge_all() in lib/sqlalchemy/orm/session.py:4154 e confrontane il comportamento con Session.merge() e con la riproduzione fornita. Aggiungi un test di regressione per il merge cascade che attiva autoflush durante la risoluzione della relazione. Il lavoro è completo quando il test conferma che merge_all() evita di eseguire il flush di uno stato parziale e la riproduzione riesce senza IntegrityError.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Session.merge_all() runs its merges outside Session.no_autoflush, while Session.merge() wraps the same _merge call in with self.no_autoflush. When a relationship cascade needs to lazy-load a detached target, the resulting autoflush inserts a half-merged, not-yet-complete object and can violate constraints.
from sqlalchemy import Column, ForeignKey, Integer, String, create_engine, select
from sqlalchemy.orm import DeclarativeBase, Session, relationship
class Base(DeclarativeBase):
pass
class Parent(Base):
__tablename__ = "parent"
id = Column(Integer, primary_key=True)
class Child(Base):
__tablename__ = "child"
id = Column(Integer, primary_key=True)
parent_id = Column(ForeignKey("parent.id"), nullable=False)
name = Column(String, nullable=False)
parent = relationship(Parent)
engine = create_engine("sqlite://")
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Parent(id=1))
session.commit()
with Session(engine) as session:
parent = session.get(Parent, 1)
with Session(engine) as session:
child = Child(name="c", parent=parent)
child.parent_id = None
session.merge_all([child]) # IntegrityError: NOT NULL constraint failed: child.parent_id
session.commit()
session.merge(child) in the same position succeeds because it uses no_autoflush.
Expected: merge_all() behaves like merge() and does not flush partially merged state while resolving the relationship. Actual: autoflush emits INSERT INTO child (parent_id, name) VALUES (NULL, NULL) and raises IntegrityError.
Likely cause: Session.merge_all at lib/sqlalchemy/orm/session.py:4154 lacks the with self.no_autoflush: block used by merge().
I have a regression test and a one-line fix ready.
- Lingua principale
- Python
- Stelle
- 12.3k
- Fork
- 1.8k
- Merge medio
- 1g 2h
- PR unite (30g)
- 5
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di sqlalchemy/sqlalchemy
-
bug orm regression
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
sqlalchemy/sqlalchemy#13718 · 8 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Inspect overloads for Any handle raiseerr wrongForse già presa @princejain756 l’ha presa 5 giorni fa. Apertacode review in progress typing
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
sqlalchemy/sqlalchemy#13704 · 5 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Document that asyncpg error messages no longer include DETAIL in 2.1Forse già presa @artem-sitd l’ha presa 17 giorni fa. Aperta
Difficoltà 1/5 1-3 ore Idoneità per principianti 82/100
sqlalchemy/sqlalchemy#13655 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
TableValueType should accept is_ operator classForse di nuovo libera @nightcityblade l’ha presa 20 giorni fa e non c’è nessuna pull request aperta. Apertapostgresql sql use case
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
sqlalchemy/sqlalchemy#13651 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
PostgreSQL multihost URL with bracketed IPv6 hosts raises ValueError: too many values to unpackForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Apertabug engine postgresql
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
sqlalchemy/sqlalchemy#13637 · 6 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di sqlalchemy/sqlalchemy
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
NVIDIA/flare-local-inference#90 ·
I maintainer di solito rispondono entro 1 giorno
-
area/streaming comp/gateway P2 platform/telegram type/bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
NousResearch/hermes-agent#144897 ·
I maintainer di solito rispondono entro 1 giorno
-
request-theme
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 66/100
LizardByte/ThemerrDB#9575 ·
I maintainer di solito rispondono entro 1 giorno
-
Author Page: noshin-nawalApertaauthor-page correction
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
acl-org/acl-anthology#10599 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
zilliztech/memsearch#818 ·
I maintainer di solito rispondono entro 1 giorno