【问题标题】:How do I remove duplicate records in an existing database? (no unique constraint defined)如何删除现有数据库中的重复记录? (未定义唯一约束)
【发布时间】:2020-01-26 05:07:06
【问题描述】:

我正在开展一个需要改进数据库架构、查询速度和模板继承的项目。例如,有一个缺少唯一约束的 Menu 模型(见下文)。

为了提高模型的数据完整性,我计划通过向season 字段添加unique=True 约束来添加迁移。

在应用迁移之前,我检查了数据库中的所有 Menu 实例,看看是否可能发生完整性错误。作为检查的结果,有 3 个模型实例具有相同的值分配给 season

在这种情况下,我想从现有数据库中删除除 1 个之外的所有 Menu 实例,保留哪一个并不重要。有什么方法可以做到这一点?

class Menu(models.Model):
    season = models.CharField(max_length=20)
    items = models.ManyToManyField('Item', related_name='items')
    created_date = models.DateTimeField(
            default=timezone.now)
    expiration_date = models.DateTimeField(
            blank=True, null=True)

    def __str__(self):
        return self.season

【问题讨论】:

标签: python django database django-models


【解决方案1】:

如果您使用的是 Postgresql,您可以使用以下代码:

all_unique_season = Menu.objects.distinct('season').values_list('id', flat=True)
Menu.objects.exclude(id__in=all_unique_season).delete()

另外,如果您使用其他数据库,您可以使用以下代码:

used_ids = list()
for i in Menu.objects.values('id', 'season'):
    used_ids.append(i['id'])
    Menu.objects.filter(season=i['season']).exclude(id__in=used_ids).delete()

【讨论】:

  • 这不会删除示例 #2 中的所有模型实例吗?如果模型实例 ID 是 id=1id=2id=3,则第一次迭代将删除具有 id=2id=3 的实例,因为 id=i['id'] 等于 1。在第二次迭代中,模型不会id=1 的实例被删除,因为它是唯一剩余的模型实例,id=i['id'] 将是 2?
猜你喜欢
  • 2012-09-17
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2017-02-23
  • 1970-01-01
  • 2014-02-13
相关资源
最近更新 更多