1

我正在为多个数据库配置我的 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)

此错误在 my 中指定第二个读取数据库时发生settings.py,当仅存在default数据库时,syncdb 命令成功完成。

有什么建议可能导致这种情况吗?

编辑: Django 版本是 1.2.3

4

1 回答 1

3

经过几个小时的修修补补,我推断发生这种情况的原因是因为某些 Django 模型(在这种情况下django.contrib.contenttype.models.ContentType也是如此django.contrib.site.models.Site)具有自己的内置缓存机制

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

解决这个问题的方法是将我的db_for_read方法更改为这样的:

    def db_for_read(自我,模型,**提示):
        if model._meta.app_label in ('contenttypes', 'sites'):
            返回'写'
        别的:
            返回“阅读”
于 2012-05-10T14:26:48.970 回答