当指定多个数据库时,Django syncdb尝试插入重复的行

时间:2012-05-08 11:08:03

标签: python mysql django django-syncdb django-orm

我正在为多个数据库配置我的Django应用程序,作为一个权宜之计,我在settings.py中使用了以下配置:

READ_DATABASE = {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'thedatabase',
    'USER': 'read_only',
    'PASSWORD': '',
    'OPTIONS': {
        'init_command': 'SET storage_engine=INNODB'
    }
}

WRITE_DATABASE = {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'thedatabase',
    'USER': 'root',
    'PASSWORD': '',
    'OPTIONS': {
        'init_command': 'SET storage_engine=INNODB'
    }
}

DATABASES = {'default': WRITE_DATABASE,
             'read': READ_DATABASE}

这些指向同一个数据库,以模拟主从对。正如您所猜测的那样,read_only用户只具有读取权限。

我的数据库路由器如下所示:

from django.conf import settings 

class MasterSlaveRouter(object):

    def db_for_read(self, model, **hints):
        return 'read' 

    def db_for_write(self, model, **hints):
        return 'default' 

    def allow_relation(self, db1, db2, **hints):
        return True

    def allow_syncdb(self, db, model):
        return db in ('default',)

运行syncdb时,它现在在设置超级用户后立即崩溃,错误为:

django.db.utils.IntegrityError: (1062, "Duplicate entry 'auth-permission' for key 'app_label'")

无法执行的违规SQL是:

INSERT INTO `django_content_type` (`name`, `app_label`, `model`) VALUES (permission, auth, permission)

当我的settings.py中第二个读取数据库被分离时,只有default数据库存在,syncdb命令成功完成时,会发生

任何可能导致此问题的建议?

编辑: Django版本为1.2.3

1 个答案:

答案 0 :(得分:2)

经过几个小时的修补,我推断出这种情况发生的原因是因为一些Django模型(在这种情况下是django.contrib.contenttype.models.ContentType,还有django.contrib.site.models.Site)有自己的{{3} }。

由于我已经为同一个数据库设置了两个不同的连接,这导致了一个问题,因为只读连接的contenttype缓存没有通过写入ContentType模型而失效在写连接上。

解决方法是将我的db_for_read方法改为:

    def db_for_read(self, model, **hints):
        if model._meta.app_label in ('contenttypes', 'sites'):
            return 'write'
        else:
            return 'read'