PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Löschen aus Many-to-Many SQL-Alchemy und Postgresql

Ich würde davon ausgehen, dass die Fehlermeldung korrekt ist:Tatsächlich haben Sie in Ihrer Datenbank 2 Zeilen, die Location verknüpfen und Heading Instanzen. In diesem Fall sollten Sie herausfinden, wo und warum dies überhaupt geschehen ist, und verhindern, dass dies erneut geschieht

  1. Um diese Annahme zu bestätigen, könnten Sie zunächst die folgende Abfrage für Ihre Datenbank ausführen:

    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. Angenommen, die Annahme wird bestätigt, fix indem Sie manuell alle Duplikate in Ihrer Datenbank löschen (wobei nur eines für jedes übrig bleibt).

  3. Fügen Sie danach eine UniqueConstraint hinzu zu Ihren headings_locations Tabelle:

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

Beachten Sie, dass Sie es der Datenbank hinzufügen müssen, es reicht nicht aus, es der sqlalchemy hinzuzufügen Modell.

Jetzt schlägt der Code, in den die Duplikate versehentlich eingefügt wurden, mit der Ausnahme der eindeutigen Einschränkungsverletzung fehl, und Sie können die Wurzel des Problems beheben.