PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Excluindo de muitos para muitos SQL-Alchemy e Postgresql


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

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

  2. Supondo que a suposição seja confirmada, corrija excluindo manualmente todas as duplicatas em seu banco de dados (deixando apenas uma para cada).

  3. Depois disso, adicione uma UniqueConstraint para seus 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'),
    )
    

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.