如何调试 Django ORM/SQL 问题? (新迁移给出空值错误,现有数据库已损坏数据)

How can I debug Django ORM/SQL issues? (fresh migration gives null value error, existing db has broken data)

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

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

但是,table、permalink 上的所有型号现在都已 57295730 - 在所有 2000 个型号上!

为了调试,我尝试完全擦除数据库,运行 migrate(~100 次迁移)- 但随后创建了一个模型实例,我被告知 permalink violates the not-null constraint 虽然我肯定是给它传递了一个值!我还得到了我传递给它的值的 list,但我不确定如何知道哪个 value/column 与哪个字段相关?

我什至尝试删除数据库、删除迁移、运行 一个新的 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

虽然我很想知道如何解决这个问题 - 我的问题确实是 "What can I do to debug this kind of situation?"

好吧,这不是我想要的答案——而是一个可行的答案:

  1. 进行自动化测试
  2. 使用CI!首先防止这个问题

如果您没有执行上述操作... 使用 git bisect(或者,如果不能,请手动使用 git reset --hard HEAD~1 来查找问题!)

在我的例子中,我以一种……愚蠢的方式覆盖了模型的保存功能!

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

但是,我没有很快注意到这个错误,因为数据库中的数据不会发生这种情况。

所以!该错误实际上提供了很多信息 - 如果我 运行 更频繁地进行测试(或使用 CI),我会立即被告知该错误,并且让自己非常头疼!

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