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

Suppression de plusieurs à plusieurs SQL-Alchemy et Postgresql

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

  1. 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
    )
    
  2. 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).

  3. 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.