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