【问题标题】:django.db.utils.IntegrityError: (1062, "Duplicate entry '22-add_' for key 'content_type_id'")django.db.utils.IntegrityError:(1062,“重复条目'22-add_'键'content_type_id'”)
【发布时间】:2012-06-26 12:27:57
【问题描述】:

我正在使用 django 多数据库路由器概念,有多个站点具有不同的数据库。基本数据库用户将使用所有其他子站点登录。

当我在基本站点中尝试 syncdb 时,它可以正常工作(在任何时候),但是如果我们下次尝试,则在其他站点上尝试 syncdb 只能在第一次工作-wards 它会抛出如下所示的完整错误

  • django.db.utils.IntegrityError: (1062, "重复条目 键 'content_type_id' 的 '22-add_somesame'")

一旦我删除了该项目中的多个数据库路由器设置,就意味着 syncdb 可以正常工作(在任何时候)。

那么这与多数据库路由器有关吗?还是什么?

请任何人就此提出建议,谢谢。

【问题讨论】:

    标签: django-database django-orm


    【解决方案1】:

    这里的问题在于 db 路由器和 django 系统对象。我在多个数据库和路由器上遇到了同样的问题。我记得这里的问题是 auth.permission 内容类型,它们混合在数据库之间。否则,syncdb 脚本会尝试在所有数据库中创建这些,然后为某些对象创建权限内容类型,该 id 已为本地模型保留。

    我有以下

    BASE_DB_TYPES = (
     'auth.user',
     'auth.group',
     'auth.permission',
     'sessions.session',
    

    )

    然后在 db 路由器中:

    def db_for_read(self, model, **hints):
        if hasattr(model, '_meta') and str(model._meta) in BASE_DB_TYPES:
            return 'base_db' # the alias of base db that will store users
        return None # the default database, or some custom mapping
    

    编辑

    此外,异常可能表示您正在为模型“somesame”声明权限“add_somesame”,而 Django 会自动为所有对象创建 add_delete_edit_ 权限。

    【讨论】:

    • 您好,感谢您的重播。我在路由器文件中做了上述事情,但结果相同。 BASE_DB_TYPES 在顶级路由器文件中定义,并且使用您的代码更新了 de_for_read 方法。还需要做其他事情吗?
    • 这需要在所有路由器中添加。您应该指示路由器这些类型将在 1 个数据库(master/auth)中创建。
    • 在主站点中没有任何路由器(不需要),我在那个路由器文件中有一个子站点可用。我的 db_for_method 配置为:def db_for_read(self, model, **hints): if hasattr(model, '_meta') and str(model._meta) in BASE_DB_TYPES: return 'usersandsessions' elif model._meta.app_label == ' auth': return 'usersandsessions' elif model._meta.app_label == 'accounts': return 'usersandsessions' elif model._meta.app_label == 'sessions': return 'usersandsessions' return None...保持不变。跨度>
    • Hmm.. 您是否为您的模型定义了自定义权限,即名为“add_somesame”的模型权限? Django 自动为所有模型创建这样的权限 - 例如模型是“mymodel”,那么它会自动创建权限“add_mymodel”、“delete_mymodel”、“edit_mymodel”。如果您尝试创建具有相同名称的权限 - 将会出现这样的错误。如果不是这种情况 - 您需要调试导致异常的确切模型并检查其创建位置(在哪个 DB 中),并找出创建重复键的原因。
    猜你喜欢
    • 1970-01-01
    • 2011-11-11
    • 2012-07-23
    • 2013-09-30
    • 2015-04-26
    • 1970-01-01
    • 2019-07-21
    • 2017-08-07
    相关资源
    最近更新 更多