对未被历史认可的django做出一个独特的约束约束

时间:2015-08-21 20:21:00

标签: mysql django postgresql

假设我有一个表格,我刚刚添加了一个新字段。我(并且我的意思是一个同事)应用了一个数据迁移,它不满足我们尚未放入的unique_together约束。所以迁移成功了。

但是现在我们要添加unique_together约束,正确的过程是什么?我可以想到三种可能性,其中没有一种看起来超级有吸引力

  1. 我是否必须返回并手动强制执行唯一约束,然后执行迁移以更改字段?
  2. 更改字段,它只适用于较新的条目(SQL忽略违反约束的旧条目......非常确定这不是一件事)
  3. 撤消数据迁移,迁移到unique_together,然后进行有效的数据迁移(这似乎是"正确"事情确实如此,但实际上很难实现)
  4. 应该注意的是,那些违反了unique_together约束的旧行我真的不在乎了。

    我在django 1.7上使用postgresql

2 个答案:

答案 0 :(得分:0)

  
      
  1. 我是否必须返回并手动强制执行唯一约束,然后执行迁移以更改字段?
  2.   

我不推荐这样做,因为您最终会得到一组可能会在其他部署中中断的迁移。如果你只有一个数据库,你可能可以逃脱它,但在这种情况下,我会在事后重置你的迁移。您不想要的是留下一组在重新运行时会失败的迁移。

  
      
  1. 更改字段,它只适用于较新的条目(SQL忽略违反约束的旧条目......非常确定这不是一件事)
  2.   

至少在某些数据库上似乎可以做到这一点。我不确定这有什么实际后果,但这似乎是一个坏主意。你提到你并不真正关心这些行。如果你不在乎你真的可以删除它们,那么问题就解决了!但是如果你足够关心它们,你应该确保它们与你的数据库模式一致(包括约束)。

  
      
  1. 撤消数据迁移,迁移到unique_together,然后进行有效的数据迁移(这似乎是"正确"事情确实如此,但实际上很难实现)
  2.   

这确实是正确的做法,我无法想到更好的主意。

答案 1 :(得分:0)

有django方式:

  1. 编写自定义迁移,在其他迁移运行之前处理表中的数据,从而创建db-constraint。