PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Eliminazione da molti a molti SQL-Alchemy e Postgresql

Presumo che il messaggio di errore sia corretto:infatti nel tuo database hai 2 righe che collegano Location e Heading istanze. In questo caso dovresti scoprire dove e perché è successo in primo luogo e impedire che ciò accada di nuovo

  1. Innanzitutto, per confermare questa ipotesi, puoi eseguire la seguente query sul tuo database:

    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. Supponendo che l'ipotesi sia confermata, correggere eliminando manualmente tutti i duplicati nel database (lasciandone solo uno per ciascuno).

  3. Successivamente, aggiungi un UniqueConstraint al tuo headings_locations tabella:

    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'),
    )
    

Nota che devi aggiungerlo al database, non è sufficiente aggiungerlo a sqlalchemy modello.

Ora il codice in cui i duplicati vengono inseriti per errore fallirà con l'eccezione di violazione del vincolo univoco e puoi correggere la radice del problema.