【问题标题】:How to see SQL query that caused error in Django migration?如何查看导致 Django 迁移错误的 SQL 查询?
【发布时间】:2019-05-14 11:17:41
【问题描述】:

我正在尝试运行删除表中所有行的数据迁移(例如,MyModel)。还有另一个表指向该表 (RelatedModel)。 RelatedModel 中映射到MyModel 的字段具有on_delete=models.SET_NULL。但是,当我运行迁移时,我得到:

  File "/usr/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 211, in _commit
    return self.connection.commit()
IntegrityError: update or delete on table "MyModel" violates foreign key constraint "f2274d6f2be82bbff458f3e5487b1864" on table "RelatedModel"
DETAIL:  Key (uuid)=(ywKMUYx7G2RoK9vqqEWZPV) is still referenced from table "RelatedModel".

我在迁移中添加了一个断点并检查了 SQL DELETE 查询。我在 shell 中以交互方式运行它们,它们在事务中工作,但是当它尝试提交迁移时,迁移仍然中断。但是我看不到哪个查询确切地导致了这个错误,所以我不知道如何调试它。有什么建议?谢谢。

PS:我使用的是 Django 1.9.13、Python 2.7、PostgreSQL 10.4。

【问题讨论】:

  • 您能否发布在迁移期间运行的迁移文件 (py)。 Postgresql 中的表表达式也会有所帮助。

标签: django postgresql django-migrations


【解决方案1】:

使用 django-debug-toolbar 查看详情。 要么 尝试: 1.根据需要使模型清晰。 2.尝试删除init文件以外的迁移。 3.删除数据库文件。 4. 现在迁移到应用程序 5.然后迁移

【讨论】:

    【解决方案2】:

    您可以使用以下管理命令打印特定迁移的 SQL 语句。

    python manage.py sqlmigrate <app label> <migration_name to print sql for>

    例如,如果您想在 django 项目中检查 hello 应用程序的迁移,并假设您想打印 0001_initial.py 的 sql 语句。比你需要执行以下行。

    python manage.py sqlmigrate hello 0001_initial.py

    它将打印将在迁移时执行的 SQL 定义(语句)。

    【讨论】:

    • 我使用的是 Django 2.5,这对我不起作用。我必须执行以下操作:python manage.py sqlmigrate hello 0001
    • 迁移的名称必须在末尾不带 .py 的情况下提及。 Django 不再支持这个。在您的示例中,必须执行以下行。 python manage.py sqlmigrate hello 0001_initial
    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2017-05-14
    • 2018-10-10
    • 1970-01-01
    • 2019-05-16
    • 2014-03-21
    • 2010-11-01
    相关资源
    最近更新 更多