Django 1.7迁移挂起



我有一个django迁移我试图应用。它做得很好(它很小,它只是添加了一个CharField到两个不同的模型。然而,当我运行实际的迁移时,它挂起了(没有失败,也没有成功,只是坐着)。

通过谷歌搜索,我发现其他打开的连接可以弄乱它,所以我重新启动了DB。然而,这个数据库连接到持续运行的作业,并且新的查询会立即潜入。然而,它们很小,上次我尝试重新启动时,我认为我能够在其他任何事情之前执行迁移。还没有。

还有其他已知的问题导致这样的事情吗?

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

  • 运行迁移脚本(将挂起)
  • 重启webserver/wsgi容器

当重新启动你的web服务器时,所有打开的事务将被中止(假设你没有后台进程也有打开的事务),所以只要没有事务阻塞你的表,迁移将完成。

我今天遇到了同样的问题。我发现你可以在运行事务之前立即使用以下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,它可以解决你的问题!

最新更新