Je suppose que le message d'erreur est correct :en effet, dans votre base de données, vous avez 2 lignes qui relient Location
et Heading
instances. Dans ce cas, vous devez savoir où et pourquoi cela s'est produit en premier lieu, et éviter que cela ne se reproduise
-
Tout d'abord, pour confirmer cette hypothèse, vous pouvez exécuter la requête suivante sur votre base de données :
q = session.query( headings_locations.c.location_id, headings_locations.c.heading_id, sa.func.count().label("# connections"), ).group_by( headings_locations.c.location_id, headings_locations.c.heading_id, ).having( sa.func.count() > 1 )
-
En supposant que l'hypothèse est confirmée, corrigez en supprimant manuellement tous les doublons de votre base de données (en n'en laissant qu'un pour chacun).
-
Après cela, ajoutez une UniqueConstraint à vos
headings_locations
tableau :headings_locations = db.Table('headings_locations', db.Column('id', db.Integer, primary_key=True), db.Column('location_id', db.Integer(), db.ForeignKey('location.id')), db.Column('headings_id', db.Integer(), db.ForeignKey('headings.id')), db.UniqueConstraint('location_id', 'headings_id', name='UC_location_id_headings_id'), )
Notez que vous devez l'ajouter à la base de données, il ne suffit pas de l'ajouter au sqlalchemy
modèle.
Désormais, le code dans lequel les doublons sont insérés par erreur échouera avec l'exception de violation de contrainte unique, et vous pouvez résoudre le problème à la racine.