Zakładam, że komunikat o błędzie jest poprawny:rzeczywiście w Twojej bazie danych masz 2 wiersze, które łączą Location
i Heading
instancje. W takim przypadku powinieneś najpierw dowiedzieć się, gdzie i dlaczego to się stało, i zapobiec powtórzeniu się tego zdarzenia
-
Najpierw, aby potwierdzić to założenie, możesz uruchomić następujące zapytanie w swojej bazie danych:
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 )
-
Zakładając, że założenie jest potwierdzone, popraw to poprzez ręczne usunięcie wszystkich duplikatów w Twojej bazie danych (pozostawiając tylko po jednym dla każdego).
-
Następnie dodaj UniqueConstraint do Twoich
headings_locations
tabela: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'), )
Pamiętaj, że musisz dodać go do bazy danych, nie wystarczy dodać go do sqlalchemy
model.
Teraz kod, w którym duplikaty są wstawiane przez pomyłkę, zakończy się niepowodzeniem z wyjątkiem naruszenia ograniczenia unikatowego i możesz naprawić źródło problemu.