Django 1.7 迁移挂起

Django 1.7 Migrations hanging

我正在尝试申请 Django 迁移。它做得很好(它很小,它只是向两个不同的模型添加了 CharField。但是当我 运行 实际迁移时它挂起(没有失败,没有成功,只是坐着)。

通过谷歌搜索,我发现其他打开的连接可能会干扰它,所以我重新启动了数据库。但是,此数据库会持续连接到 运行 宁个作业,并且新查询会立即潜入。但是它们很小,上次我尝试重新启动时,我认为我能够先执行迁移。仍然没有。

是否有任何其他已知问题导致类似情况?

至少在 PostgreSQL 中,当存在活动事务时,您不能修改 tables(即使它只是添加新列)。最简单的解决方法通常是:

  • 运行 迁移脚本(会挂起)
  • 重新启动您的 webserver/wsgi 容器

当重新启动您的网络服务器时,所有打开的事务都将被中止(假设您没有同时打开事务的后台进程),因此只要没有事务阻止您的 table,迁移就会完成.

我今天遇到了同样的问题。我发现您可以在 运行 您的交易之前立即使用以下 SQL 清除 PostgreSQL 中任何挂起的交易:

-- View all the current activity
-- SELECT * FROM pg_stat_activity;

-- terminate other connections (make sure to add your own IP address)
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE client_addr <> 'YOUR IP HERE'

这将终止任何不属于您的连接,这可能并非在所有情况下都是理想的,但非常有效。

对于未来的读者来说值得注意的是,当尝试为不正确大小的 CharField(依赖于 DB 实现)应用迁移时,迁移可能会挂起。我试图将 CharField 更改为大于 255 的大小,但它只是挂起。即使按照规定终止连接后,它也不会将其修复为大小大于 255 的 CharField,因为这对我的实现 (postgresql) 来说是不正确的。

TLDR; 确保您的 CharField 为 255 或更小,如果更大,请将您的 CharField 更改为 TextField,它可以解决您的问题!