sql >> Databasteknik >  >> RDS >> PostgreSQL

Ta bort från många-till-många SQL-Alchemy och Postgresql

Jag skulle anta att felmeddelandet är korrekt:i din databas har du verkligen 2 rader som länkar Location och Heading instanser. I det här fallet bör du ta reda på var och varför detta hände från början, och förhindra att detta händer igen

  1. Först, för att bekräfta detta antagande, kan du köra följande fråga mot din databas:

    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. Förutsatt att antagandet är bekräftat, fixa det genom att manuellt ta bort alla dubbletter i din databas (lämna bara en för varje).

  3. Efter det lägger du till en UniqueConstraint till dina headings_locations tabell:

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

Observera att du måste lägga till den i databasen, det räcker inte att lägga till den i sqlalchemy modell.

Nu kommer koden där dubbletterna infogas av misstag att misslyckas med det unika undantaget för överträdelse av begränsningar, och du kan åtgärda roten till problemet.




  1. Varför får jag inte tillräckligt med värden när jag kör en INSERT?

  2. Bästa sättet att denormalisera data i Django?

  3. Mysqldump' känns inte igen som ett internt eller externt kommandoprogram eller batchfil

  4. Hur man inaktiverar PL/SQL i Oracle-frågor