【问题标题】:django - unique_together change - any danger in prod db?django - unique_together 更改 - prod db 中的任何危险?
【发布时间】:2015-04-22 13:44:55
【问题描述】:

我有一个模型:

class MyModel(models.Model):
   name = models.CharField(max_length=10)
   nickname = models.CharField(max_length=10)
   title = models.CharField(max_length=10)
   score = models.CharField(max_length=10)

   class Meta: 
      unique_together = ['name', 'nickname']

unique_together改成有什么影响

unique_together = ['name', 'title']

在部署此更新之前我应该​​小心吗?有超过 150.000 名用户同时在线,在最坏的情况下会发生什么?

【问题讨论】:

  • 查看相关question
  • @Ajoy 是的,但就我而言,我只是切换了现有的唯一键。但感谢非常有用的链接
  • 我认为它与添加新约束的效果相同。您可以先在一些测试数据上进行尝试。

标签: python django


【解决方案1】:

是的,我会小心部署此更改,因为它会影响数据库。 来自the documentation

这是一个元组的元组,当一起考虑时必须是唯一的。它在 Django 管理员中使用,并在数据库级别强制执行(即,适当的 UNIQUE 语句包含在 CREATE TABLE 语句中)。

所以您需要migrate your database 来更改UNIQUE 约束。

python manage.py makemigrations myapp
python manage.py migrate myapp

您还需要检查您的模型的任何现有实例是否共享该对唯一约束。您可以使用以下内容进行检查:

MyModel.objects.filter(name__exact=models.F(title)).exists()

并修改或删除它们。

您还需要确保每个模型实例实际上都有一个 title 并且不是空字符串(即使这可能不应该发生)。

MyModel.objects.filter(title__exact="")

【讨论】:

  • 我要添加的唯一其他“危险”是(取决于表的大小)迁移可能需要很长时间才能创建新索引。
  • @MattBriançon 好点,我更新了关于在线用户数量的问题,是我的错字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 2018-09-04
  • 2013-03-21
  • 2021-12-01
  • 2015-12-07
  • 2011-01-17
  • 2021-08-24
相关资源
最近更新 更多