2017-10-27 28 views
0

自分のDB(postgres)に 'unique_together'を設定したいと思います。問題は、すでにDBに重複がある可能性があるため、移行がうまくいかないことです。だから、私が見るように - 展開の前に、すべての複製を削除するためにスクリプトを実行する必要があります(それぞれ1つだけ残してください)。私はDjango Custom Commandでやっている方が好きです。Django - DBから重複したレコードを削除する

テーブル 'mapping'は、 - Id、user_id、user_role、project_id、user_typeのようになります。 私はそれらのすべてのために 'unique_together'を設定したいと思います。 そして、私はそれが重複した属性が含まれているオブジェクトのリストを返しますが -

duplicates = (Mapping.objects.values('project_id', 'user_id', 'user_type', 'user_role').annotate(
     count=Count('id')).values('project_id', 'user_id', 'user_type', 'user_role').order_by(). 
      filter(count__gt=1)) 

重複行を取得するために使用するスクリプト。例えば :

QuerySet [{'user_id': '2222', 'user_type': '1', 'user_role': '1', 'project_id': UUID('c02bda0e-5488-4519-8f34-96b7f3d36fd6')}, {'user_id': '44444', 'user_type': '1', 'user_role': '1', 'project_id': UUID('8c088f57-ad0c-411b-bc2f-398972872324')}]> 

は直接のIdsを取得する方法はありますか? 良い方法がありますか?

+0

おそらくこれはhttps://stackoverflow.com/questions/23908971/find-duplicate-entries-in-database-for-specific-を見つけて、重複を除去するために役立ちます。フィールド – user8845619

答えて

1

あなたはそれを試すことができます。

Mapping.objects.values(
    'project_id', 'user_id', 'user_type', 'user_role' 
).annotate(count=Count('id') 
).annotate(max_id=Max('id') 
).values('max_id').order_by().filter(count__gt=1) 
+0

'id'はUUIDであるため、次のエラーが表示されます - ライン1:SELECT MAX( "マッピング"。 "ID")AS "max_id" FROM ... ^ ヒント:名前と引数の型。明示的な型キャストを追加する必要があるかもしれません。しかし、私が理解しているように、それは行だけに戻ってくると思われます、それは正しいのですか? – user2880391

+0

あなたのケースでは問題がIDタイプにあり、uuidを使用してデータベースがこのタイプのフィールドにmax関数を適用できなかった場合、uuidのカスタム関数を例として指定できます:[PostgreSQL create UUID max aggregate function ](https://gist.github.com/devodo/8b39748d65e8185fbd89)、申し訳ありませんが、私はあなたのさらなる助けを与えることができませんでした –

関連する問題