sql >> データベース >  >> RDS >> PostgreSQL

多対多のSQLからの削除-AlchemyとPostgresql

    エラーメッセージは正しいと思います。実際、データベースにはLocationをリンクする2つの行があります。 およびHeading インスタンス。この場合、そもそもこれがどこで、なぜ起こったのかを調べ、これが再び起こらないようにする必要があります

    1. まず、この仮定を確認するために、データベースに対して次のクエリを実行できます。

      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. 仮定が確認されたと仮定して、修正 データベース内のすべての重複を手動で削除します(それぞれに1つだけ残します)。

    3. その後、UniqueConstraint を追加します headings_locationsに 表:

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

    データベースに追加する必要があることに注意してください。sqlalchemyに追加するだけでは不十分です。 モデル。

    これで、重複が誤って挿入されたコードは、一意性制約違反の例外で失敗し、問題の根本を修正できます。




    1. PostgreSQLを使用してすべてのデータベースを一覧表示する方法

    2. oracleblobテキスト検索

    3. MySQL Select Wheremaxdateとmaxtime

    4. Oracleで2番目に大きい最小値を選択します