sql >> Databáze >  >> RDS >> PostgreSQL

Odstranění z many-to-many SQL-Alchemy a Postgresql

Předpokládám, že chybová zpráva je správná:skutečně ve vaší databázi máte 2 řádky, které odkazují Location a Heading instance. V tomto případě byste měli nejprve zjistit, kde a proč se to stalo, a zabránit tomu, aby se to opakovalo

  1. Nejprve, abyste potvrdili tento předpoklad, můžete spustit následující dotaz proti vaší databázi:

    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. Za předpokladu, že je předpoklad potvrzen, opravit ručním odstraněním všech duplikátů ve vaší databázi (pro každého ponecháte pouze jeden).

  3. Poté přidejte UniqueConstraint do vašich headings_locations tabulka:

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

Upozorňujeme, že jej musíte přidat do databáze, nestačí jej přidat do sqlalchemy model.

Nyní kód, do kterého jsou duplikáty vloženy omylem, selže s jedinečnou výjimkou porušení omezení a vy můžete vyřešit kořen problému.




  1. Průběžný součet pro každý záznam ve skupině podle

  2. Syntaxe SQL aktualizačního dotazu s vnitřním spojením

  3. vložte pole primárního klíče autoinkrementace `id` explicitně v laravel 5.2

  4. Oprava tabulky Mysql se nezdařila:Nelze vytvořit nový dočasný soubor