如何调试 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?"
好吧,这不是我想要的答案——而是一个可行的答案:
- 进行自动化测试
- 使用CI!首先防止这个问题
如果您没有执行上述操作...
使用 git bisect
(或者,如果不能,请手动使用 git reset --hard HEAD~1
来查找问题!)
在我的例子中,我以一种……愚蠢的方式覆盖了模型的保存功能!
编辑:
更详细一点,我将 permalink
设置为比当前最大值大 1 - 但在较早的提交中,删除了 + 1
但是,我没有很快注意到这个错误,因为数据库中的数据不会发生这种情况。
所以!该错误实际上提供了很多信息 - 如果我 运行 更频繁地进行测试(或使用 CI),我会立即被告知该错误,并且让自己非常头疼!
所以,简而言之:**编写测试,运行它们 - 自动 **
所以,更详细一点,我有一个模型,其字段如下: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?"
好吧,这不是我想要的答案——而是一个可行的答案:
- 进行自动化测试
- 使用CI!首先防止这个问题
如果您没有执行上述操作...
使用 git bisect
(或者,如果不能,请手动使用 git reset --hard HEAD~1
来查找问题!)
在我的例子中,我以一种……愚蠢的方式覆盖了模型的保存功能!
编辑:
更详细一点,我将 permalink
设置为比当前最大值大 1 - 但在较早的提交中,删除了 + 1
但是,我没有很快注意到这个错误,因为数据库中的数据不会发生这种情况。
所以!该错误实际上提供了很多信息 - 如果我 运行 更频繁地进行测试(或使用 CI),我会立即被告知该错误,并且让自己非常头疼!
所以,简而言之:**编写测试,运行它们 - 自动 **