sql >> Database >  >> RDS >> PostgreSQL

Verwijderen uit veel-op-veel SQL-Alchemy en Postgresql

Ik neem aan dat de foutmelding correct is:inderdaad in je database heb je 2 rijen die linken naar Location en Heading gevallen. In dit geval moet u uitzoeken waar en waarom dit in de eerste plaats is gebeurd, en voorkomen dat dit opnieuw gebeurt

  1. Om deze veronderstelling te bevestigen, kunt u eerst de volgende query uitvoeren op uw 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. Ervan uitgaande dat de aanname wordt bevestigd, repareren door handmatig alle duplicaten in uw database te verwijderen (er blijft er slechts één voor elk).

  3. Voeg daarna een UniqueConstraint toe naar uw headings_locations tafel:

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

Merk op dat u het aan de database moet toevoegen, het is niet voldoende om het toe te voegen aan de sqlalchemy model.

Nu zal de code waar de duplicaten per ongeluk zijn ingevoegd, mislukken met de unieke uitzondering voor schending van beperkingen, en kunt u de oorzaak van het probleem oplossen.




  1. Voeg binair groot object (BLOB) in PostgreSQL in met libpq vanaf een externe machine

  2. Trimt de MySQL TRIM-functie geen regeleinden of regeleinden?

  3. Hoe bereken ik de week van het jaar in Oracle met een niet-standaard eerste dag van de week?

  4. Wat geeft parameters door aan SQL en waarom heb ik deze nodig?