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
-
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 )
-
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).
-
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.