Django 1.7 迁移挂起
Posted
技术标签:
【中文标题】Django 1.7 迁移挂起【英文标题】:Django 1.7 Migrations hanging 【发布时间】:2015-10-31 07:15:30 【问题描述】:我正在尝试申请 django 迁移。它变得很好(它很小,它只是将CharField
添加到两个不同的模型。但是当我运行实际迁移时它会挂起(没有失败,没有成功,只是坐着)。
通过谷歌搜索,我发现其他打开的连接可能会弄乱它,所以我重新启动了数据库。然而,这个数据库连接到持续运行的作业,并且新的查询会立即潜入。但是它们很小,上次我尝试重新启动时,我认为我能够先执行迁移。还是什么都没有。
是否还有其他已知问题会导致此类问题?
【问题讨论】:
请为您的迁移添加代码(如果您需要清除敏感数据,请添加代表性示例)并使用您正在使用的数据库标记/更新问题。 【参考方案1】:至少在 PostgreSQL 中,当有活动事务时,您不能修改表(即使它只是添加新列)。最简单的解决方法通常是:
运行迁移脚本(将会挂起) 重启你的 webserver/wsgi 容器重新启动您的网络服务器时,所有打开的事务都将被中止(假设您没有同时打开事务的后台进程),因此只要没有事务阻塞您的表,迁移就会完成。
【讨论】:
快速澄清您的答案。如果有正在添加的事务,并且我运行我的脚本,它会被添加到队列中吗?这样它肯定会在添加任何其他新事务之前运行吗?或者如果正在添加新交易,它会一直卡住吗? 这与“添加”交易无关(不确定您的意思)。 DDL 命令只是挂起,直到它们可以被执行,即没有活动的事务。我不知道 PG 是否真的拒绝了新事务,而有一条待执行的 DDL 语句要执行。【参考方案2】:我今天也遇到了同样的问题。我发现您可以在运行事务之前立即使用以下 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'
这将终止任何不属于您的连接,这在所有情况下可能都不理想,但就像一个魅力。
【讨论】:
pg_terminate_backend(pid)
我正在使用的版本,PostgreSQL 10.5【参考方案3】:
对于未来的读者,值得注意的是,当尝试为不正确大小的 CharField(依赖于 DB 实现)应用迁移时,迁移可能会挂起。我试图将 CharField 更改为大于 255 的大小,但它只是挂起。即使按照说明终止连接后,它也不会将其修复为大小大于 255 的 CharField,因为这与我的实现(postgresql)不正确。
TLDR;确保您的 CharField 为 255 或更少,如果更大,请将您的 CharField 更改为 TextField,它可以解决您的问题!
【讨论】:
以上是关于Django 1.7 迁移挂起的主要内容,如果未能解决你的问题,请参考以下文章
在迁移中获取模型 ContentType - Django 1.7
从 South 迁移到 Django 1.7 迁移:可交换依赖项