Django column “name” of relation “django_content_type” does not exist
在执行迁移(python manage.py migrate)时,我一直收到以下错误:
1 | django.db.utils.ProgrammingError: column"name" of relation"django_content_type" does not exist |
我已经做了以下尝试,但没有成功:
运行Django 1.8.2。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | python manage.py showmigrations admin [ ] 0001_initial auth [ ] 0001_initial [ ] 0002_alter_permission_name_max_length [ ] 0003_alter_user_email_max_length [ ] 0004_alter_user_username_opts [ ] 0005_alter_user_last_login_null [ ] 0006_require_contenttypes_0002 contenttypes [X] 0001_initial [ ] 0002_remove_content_type_name hashtags [ ] 0001_initial [ ] 0002_hashtagvisit_user posts [ ] 0001_initial [ ] 0002_auto_20150530_0715 sessions [ ] 0001_initial users [ ] 0001_initial |
号
谢谢你的帮助。
我今天遇到了同样的问题,我想添加一个问题摘要以及如何解决它:
问题来源:Django 1.8更改了其内部数据库结构,数据库中不再存在列
为了解决这个问题,会自动创建一个迁移
通常,您的所有迁移都应该应用,并且应该记录在表
例如,如果您使用dump data备份了数据库,清除(刷新)了所有数据库内容,并使用loaddata加载了转储,那么您的
因此,
您可以通过检查您的
1 2 3 | contenttypes [X] 0001_initial [X] 0002_remove_content_type_name |
你很好(或者事实上你有一个不同的问题),以防看起来像这样
1 2 3 | contenttypes [ ] 0001_initial [ ] 0002_remove_content_type_name |
号
你遇到了上述情况。请仔细检查数据库是否包含所有表和所有列(除了要在失败的迁移中应用的更改)。
要做什么/逐步解决方案:因此,我们的数据库结构是正常的(除了您希望在失败的迁移中应用的更改),但是Django/Migrate不知道这一点。所以让我们做点什么:
告诉Django,所有内容类型迁移都已应用:
不要告诉Django,您要应用的迁移之前的所有迁移都已应用。为此,您需要迁移编号,如
1 2 3 | my_app [ ] 0001_initial [ ] 0002_auto_20160616_0713 |
您的
现在我们可以应用Missiong迁移了,这次我们要做的是真正的而不是伪造的!所以我们运行
如果您的上一次迁移依赖于其他尚未被伪造的迁移,那么您应该事先伪造它们。
复查和清理:再次使用
你不应该做的事
- 删除所有迁移—在生产设置中,这可能不适用,因为它们可能包含一些迁移不应丢失的数据的工作。
- 手动将列
name 添加到contenttypes中-在应用迁移之后将删除该列。好吧,这是一个有效的黑客,但它不能解决问题。 删除所有迁移
删除
django_migrations 中的记录手工添加
name 列:1ALTER TABLE django_content_type ADD COLUMN name character varying(50) NOT NULL DEFAULT 'someName';运行假首字母:
$ python manage.py migrate --fake-initial
小精灵你应该做的事
试着找出你是如何进入这种情况的,并找到避免这种情况的方法。
我的问题是,我的项目有不同的数据库(用于快速开发测试的sqlite,用于真实世界测试的本地Postgres,用于生产的远程Postgres),我想将内容从一个复制到另一个。
当升级到1.8并从mysql迁移到postgres时遇到了这个问题。
我无法解释发生错误的原因,但我可以通过手动添加列来绕过它:
编辑:2016年12月:我建议这是一个解决方案,更适合个人项目或本地环境,而不是生产环境。显然,如果你关心你的迁移历史,这不是一条路。
在我们决定从版本控制(Git)中删除迁移并从头创建新数据库之后,我遇到了这个错误。
对我有用的东西(老实说,我不知道为什么)是为每个应用程序运行"makemigrations"。因此,对于每个django应用程序,"python manage.py makemigrations app1"、"python manage.py makemigrations app2"等。
最后,我运行了"python manage.py migrate",交叉手指,它工作了。
了解这项工作的方式/原因会有所帮助。
我知道这是一个老问题,但这可能对某些人有所帮助。我也收到了这个错误。问题是内容类型有一个名为0002的迁移,即删除"名称"列的"内容类型名称"。
从表和文件夹中删除迁移数据后,此步骤适用于我:
1 2 3 | ./manage.py makemigrations myappname ./manage.py migrate myappname ./manage.py migrate --fake contenttypes |
号
如果您确定数据库的其余部分反映了您的迁移,则可以使用:
1 | ./manage.py migrate --fake |
结果如下:
1 | ./manage.py showmigrations |
。
在那之后,你所有的迁移都应该被标记,你应该很好
我有同样的问题,但是我可以通过将其添加到迁移依赖项中来解决它:
1 | ('contenttypes', '0002_remove_content_type_name') |
。
希望有帮助!
另一个适用于我的变体(来自空白数据库)是:
1 2 | ./manage.py makemigrations myappname ./manage.py migrate |
一个不起作用的变体是:
1 2 | ./manage.py makemigrations myappname ./manage.py migrate myappname |
。
或者,更确切地说,这一序列显然是第一次起作用,但第二次起作用却不起作用,因为当时人们抱怨
上面的工作变量(前两行)似乎是等幂的。
(已编辑:从原来的3行工作版本中删除多余的第二行)