Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQLAlchemy DELETE Erreur causée par le fait d'avoir à la fois un chargement différé ET une version dynamique de la même relation

les relations Group.users et Group.users_dynamic tentent de concilier le fait que le groupe est supprimé tout en étant en mesure de gérer le User() les objets auxquels ils se réfèrent ; une relation réussit tandis que la seconde échoue, car les lignes de la table d'association ont déjà été supprimées. La solution la plus simple consiste à marquer toutes les relations identiques sauf une comme en lecture seule :

class Group(Base):
    __tablename__ = 'groups'
    id = Column(Integer, primary_key=True)

    users = relationship('User', secondary=users_groups, lazy='select', backref='groups')
    users_dynamic = relationship('User', viewonly=True, secondary=users_groups, lazy='dynamic')

si vous souhaitez toujours que les deux relations gèrent un certain degré de mutations, vous devez le faire avec précaution car SQLAlchemy ne sait pas comment coordonner les changements dans deux relations en même temps, donc des conflits comme celui-ci peuvent continuer à se produire (comme les doubles insertions, etc.) si vous faites des mutations équivalentes sur les deux relations. Pour vous occuper uniquement du problème de "suppression", vous pouvez également essayer de définir Group.users_dynamic sur passive_deletes=True :

class Group(Base):
    __tablename__ = 'groups'
    id = Column(Integer, primary_key=True)

    users = relationship('User', secondary=users_groups, lazy='select', backref='groups')
    users_dynamic = relationship('User', passive_deletes=True, secondary=users_groups, lazy='dynamic')