如何调试Django ORM / SQL问题? (全新迁移会产生空值错误,现有数据库已破坏数据)

时间:2016-03-30 00:21:27

标签: django postgresql django-models django-orm django-migrations

所以,更详细一点,我有一个模型,其字段如下:permalink = models.IntegerField(default=0)

我实际上并没有使用这个字段 - 但现在想。

但是,似乎所有2000款型号上的所有型号permalink现在都是57295730

在尝试调试时,我尝试完全擦除数据库,运行migrate(~100次迁移) - 但随后创建了模型的实例,我被告知permalink violates the not-null constraint尽管我肯定在通过这是一个价值!我还得到了传递它的值的列表,但我不知道如何知道哪个值/列与哪个字段相关?

我甚至尝试删除数据库,删除迁移,运行新的makemigrations - 并仍然获得空违规...

更奇怪的是,看起来这个领域自初次迁移以来还没有被触及!

migrations$ egrep permalink * 0001_initial.py: ('permalink', models.IntegerField(default=0)), migrations$

我正在运行(k)ubuntu 14.04,postgres 9.3,python 3.4,django 1.9.4

虽然我很想知道如何解决这个问题 - 我的问题是真的"我可以做些什么来调试这种情况?"

1 个答案:

答案 0 :(得分:0)

那不是我想要的答案 - 但是一个有效的答案:

  1. 进行自动化测试
  2. 使用CI!首先防止出现这个问题
  3. 如果你没有做上述事情......  使用git bisect(或者,如果您不能,请手动使用git reset --hard HEAD~1来查找问题!)

    在我的案例中,我以愚蠢的方式超越了模特的保存功能!

    编辑: 更详细一点,我将permalink设置为比当前最大值大1 - 但在之前的提交中,删除了+ 1

    但是,我没有快速注意到这个错误,因为数据库中没有数据。

    原来如此!错误实际上是非常有用的 - 如果我经常运行我的测试(或使用CI)我会立即被告知错误,并且让我自己很头疼!

    所以,简而言之:**写测试,运行它们 - 自动 **