假设我的服务器上有一个django应用程序,但我希望使用django.contrib.auth.models进行身份验证,其中User和Group模型/数据位于另一个数据库的另一台服务器上。在Django中,我的DATABASES设置将是这样的:
DATABASES = {
'default': {},
'auth_db': {
'NAME' : 'my_auth_db',
'ENGINE' : 'django.db.backends.mysql',
'USER' : 'someuser',
'PASSWORD' : 'somepassword',
'HOST' : 'some.host.com',
'PORT' : '3306',
},
'myapp': {
'NAME': 'myapp_db',
'ENGINE': 'django.db.backends.mysql',
'USER': 'localuser',
'PASSWORD': 'localpass',
}
}
DATABASE_ROUTERS = ['pathto.dbrouters.AuthRouter', 'pathto.dbrouters.MyAppRouter']
第一个问题:这是否可行,即它是否允许我使用存储在远程数据库'my_auth_db'中的用户登录我的Django应用程序?
假设上面的答案是肯定的,如果在我的本地数据库(应用程序'myapp')中,我的模型对用户有一个ForeignKey会怎么样?换句话说,我的模型SomeModel在myapp中定义并且应该存在于myapp_db中,但它在my_auth_db中有一个用户的ForeignKey:
class SomeModel(models.model):
user = models.ForeignKey(User, unique=False, null=False)
description = models.CharField(max_length=255, null=True)
dummy = models.CharField(max_length=32, null=True)
etc.
第二个问题:这是可能的还是一个DB表根本不可能有一个ForeignKey到另一个DB中的表?
如果我真的想让这个工作,我可以用IntegerField'user_id'替换ForeignKey字段'user',然后如果我需要somemodel.user,我会得到somemodel.user_id并使用models.User.objects。 get(pk = somemodel.user_id),路由器知道在哪里查询用户的auth_db?这是一种可行的方法吗?
答案 0 :(得分:2)
问题1的答案是:是的。
在任何情况下,您需要的是database router(Django文档中的示例与auth应用程序完全相同,因此无需在此处复制此代码。)
问题2的答案是:也许。不正式。这取决于你如何设置MySQL:
https://docs.djangoproject.com/en/dev/topics/db/multi-db/#limitations-of-multiple-databases
Django 目前不为跨越多个数据库的外键或多对多关系提供任何支持。
这是因为参照完整性。
但是,如果您使用SQLite或 MySQL与MyISAM 表,则没有强制参照完整性;因此,您可以'伪造'跨数据库外键。但是,Django并未正式支持此配置。
我有几个遗留MySQL数据库(readonly)的设置。这个答案显示How to use django models with foreign keys in different DBs?
我后来遇到了Django ManyToMany through with multiple databases的麻烦,解决方案(如接受的答案中所述)是用引号设置表名:
class Meta:
db_table = '`%s`.`table2`' % db2_name
可能提供一些其他信息的相关问题:
How to work around lack of support for foreign keys across databases in Django
How to use django models with foreign keys in different DBs?
如果有人愿意接受所有这些信息并将其放入Django官方文档中,那将是很好的: - )