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

Sletning fra mange-til-mange SQL-Alchemy og Postgresql

Jeg vil antage, at fejlmeddelelsen er korrekt:i din database har du faktisk 2 rækker, der linker Location og Heading tilfælde. I dette tilfælde bør du finde ud af, hvor og hvorfor dette skete i første omgang, og forhindre, at det sker igen

  1. For det første, for at bekræfte denne antagelse, kan du køre følgende forespørgsel mod din 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. Forudsat, at antagelsen er bekræftet, fix det ved manuelt at slette alle dubletter i din database (efterlader kun én til hver).

  3. Derefter skal du tilføje en UniqueConstraint til dine headings_locations tabel:

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

Bemærk, at du skal tilføje det til databasen, det er ikke nok at tilføje det til sqlalchemy model.

Nu vil koden, hvor dubletterne er indsat ved en fejltagelse, mislykkes med den unikke undtagelse for overtrædelse af begrænsninger, og du kan løse roden til problemet.




  1. Gennemtving sammensat unik begrænsning, der afhænger af overordnet kolonneværdi

  2. Udarbejdet erklæring om Postgresql in Rails

  3. Hvordan får man poster tilfældigt fra Oracle-databasen?

  4. SQL Server vs. NoSQL