【问题标题】:After Upgrading Django from 1.3 to 1.4.3 Syncdb Fails to delete stale content types将 Django 从 1.3 升级到 1.4.3 后,Syncdb 无法删除过时的内容类型
【发布时间】:2013-01-28 12:27:22
【问题描述】:

如何才能成功删除过时的内容?
键入 yes 会产生以下结果:

Creating tables ...

以下内容类型已过时,需要删除:

auth | message

通过外键与这些内容类型相关的任何对象也将 被删除。您确定要删除这些内容类型吗? 如果您不确定,请回答“否”。

Type 'yes' to continue, or 'no' to cancel: yes

Traceback(最近一次调用最后一次): ...

raise errorclass, errorvalue
django.db.utils.DatabaseError: 
(1146, "Table '<db_name>.auth_group_permissions' doesn't exist")
Process finished with exit code 1

我尝试的另一件事是:

from django.contrib.contenttypes.models import ContentType
ct = ContentType.objects.get(app_label='auth',model='messages')

我收到以下信息:

DoesNotExist: ContentType matching query does not exist.

【问题讨论】:

    标签: python django content-type syncdb


    【解决方案1】:

    你可以做一个

    python manage.py dbshell
    

    并检查您之前创建的所有表。

    查看 auth_group_permissions 是否存在。如果它不存在,我想您可以手动创建它并再次执行该过程。

    【讨论】:

    • auth_group_permissions 在数据库中不存在。如何手动创建?
    • 问题原来是数据库问题。不知何故 auth_group_permissions 被删除了......所以我创建了一个新数据库。我创建了一个新的 django 项目。跑同步数据库。然后我以root身份在MYSQL下运行以下命令 USE ;创建表 auth_group_permissions LIKE .auth_group_permissions;
    【解决方案2】:

    auth.message 的内容类型的model 字段是'message' 而不是'messages'
    所以试试

    ct = ContentType.objects.get(app_label='auth',model='message')

    然后您可以列出ct.permission_set.all() 甚至运行ct.delete()(在事务中并打印要删除的相关对象)来重现该问题。

    另外,关于'missing table'的错误很奇怪,你能在数据库中检查该表是否真的存在吗?还是您在 1.3 中配置了多个 DB?

    【讨论】:

    • 很好地抓住了我的错字。但是,当我运行 ct.delete() 时,我仍然收到 DatabaseError: (1146, "Table '.auth_group_permissions' 不存在")。看了一下自己的数据库,发现这个表不存在,但是不知道怎么创建。
    • 当我运行 ct.permission_set.all() 我得到: [,,]
    • 我只有一个数据库。但是,我有两个单独的项目共享数据库。这些项目不共享相同的表。
    • @nueverest 很好,你已经解决了。当您需要手动操作数据库时,请记住备份重要数据。在 localhost 上,您可以安全地删除和重建表或整个数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2013-05-30
    相关资源
    最近更新 更多