删除Django DB中的重复行

Bre*_*den 14 python django

我有一个模型,因为代码错误,有重复的行.我现在需要从数据库中删除任何重复项.

每一行都应该有一个独特的photo_id.有一种简单的方法可以删除它们吗?或者我需要做这样的事情:

rows = MyModel.objects.all()
for row in rows:
    try:
        MyModel.objects.get(photo_id=row.photo_id)
    except:
        row.delete()
Run Code Online (Sandbox Code Playgroud)

Yuj*_*ita 28

最简单的方法是最简单的方法!特别是对于性能甚至不重要的一个脚本(除非它确实如此).因为它不是核心代码,所以我只想写出第一个想到并且有用的东西.

# assuming which duplicate is removed doesn't matter...
for row in MyModel.objects.all():
    if MyModel.objects.filter(photo_id=row.photo_id).count() > 1:
        row.delete()
Run Code Online (Sandbox Code Playgroud)

一如既往,在你做这件事之前备份.

  • 谢谢。您是否知道只向我显示哪些行是重复的查询?我知道distinct会向我显示没有伪造的数据库,但是什么会告诉我只是伪造呢? (2认同)
  • SELECT * FROM table GROUP BY photo_id HAVING COUNT(photo_id)> 1;` (2认同)

小智 16

这可能更快,因为它避免了MyModel中每行的内部过滤器.

由于id是唯一的,如果模型按它们按递增顺序排序,我们可以跟踪我们看到的最后一个id,当我们看到具有相同id的模型时,我们遍历行,它必须是重复的,所以我们可以删除它.

lastSeenId = float('-Inf')
rows = MyModel.objects.all().order_by('photo_id')

for row in rows:
  if row.photo_id == lastSeenId:
    row.delete() # We've seen this id in a previous row
  else: # New id found, save it and check future rows for duplicates.
    lastSeenId = row.photo_id 
Run Code Online (Sandbox Code Playgroud)

  • 关于性能,这肯定是更好的选择!谢谢,我们需要一个大型数据库! (2认同)