sql >> Base de Datos >  >> RDS >> PostgreSQL

Eliminar de muchos a muchos SQL-Alchemy y Postgresql

Supongo que el mensaje de error es correcto:de hecho, en su base de datos tiene 2 filas que vinculan Location y Heading instancias. En este caso, debe averiguar dónde y por qué sucedió esto en primer lugar y evitar que vuelva a suceder

  1. Primero, para confirmar esta suposición, puede ejecutar la siguiente consulta en su base de datos:

    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. Suponiendo que se confirme la suposición, corregir eliminando manualmente todos los duplicados en su base de datos (dejando solo uno para cada uno).

  3. Después de eso, agregue un UniqueConstraint a tus headings_locations tabla:

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

Tenga en cuenta que debe agregarlo a la base de datos, no es suficiente agregarlo a sqlalchemy modelo.

Ahora, el código donde se insertan los duplicados por error fallará con la excepción de violación de restricción única, y puede solucionar la raíz del problema.