【发布时间】:2012-05-16 20:47:20
【问题描述】:
我正在为多个数据库配置我的 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
【问题讨论】:
-
如何指定
DATABASE_ROUTERS?post_syncdb好像被触发了两次。 -
DATABASE_ROUTERS = ['path.to.MasterSlaveRouter']在我的配置文件中。 -
好的,你能显示实际的
path.to吗;并尝试将MasterSlaveRouter放入设置中,然后设置DATABASE_ROUTERS = ['settings.MasterSlaveRouter']? -
路由器肯定被击中 - 我已将
import pdb; pdb.set_trace添加到db_for_read/write方法中验证这一点。断点被击中,路由器的可发现性绝对不是问题。不过感谢您的建议。 -
是的,我并不是说它没有被使用过。我的意思是导入可能会导致
post_syncdb被绑定多次,因此 contenttypes 想要为 Permission 模型生成 content_type 两次,因此出现错误
标签: python mysql django django-syncdb django-orm