Eu diria que a mensagem de erro está correta:de fato, em seu banco de dados, você tem 2 linhas que vinculam
Location
e Heading
instâncias. Nesse caso, você deve descobrir onde e por que isso aconteceu em primeiro lugar e evitar que isso aconteça novamente -
Primeiro, para confirmar essa suposição, você pode executar a seguinte consulta em seu banco de dados:
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 )
-
Supondo que a suposição seja confirmada, corrija excluindo manualmente todas as duplicatas em seu banco de dados (deixando apenas uma para cada).
-
Depois disso, adicione uma UniqueConstraint para seusheadings_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'), )
Observe que você precisa adicioná-lo ao banco de dados, não é suficiente adicioná-lo ao
sqlalchemy
modelo. Agora, o código onde as duplicatas são inseridas por engano falhará com a exceção de violação de restrição exclusiva e você poderá corrigir a raiz do problema.