我试图在运行时在两个mysql服务器之间切换。我不需要一直保持两个连接都是活着的。
这就是我正在做的事情
from django.conf import settings
from django.db import connection
from django.contrib.auth.models import User
connection.close()
setattr(settings, 'DATABASE_HOST', 'mysql1.com')
list1 = User.objects.all()
connection.close()
setattr(settings, 'DATABASE_HOST', 'mysql2.com')
list2 = User.objects.all()
我有以下settings.py:
DATABASE_HOST = '' # localhost
DATABASE_NAME = test
...
所有服务器上的数据库名称相同,只有每个表的内容不同。
我应该得到list1!= list2,因为两台服务器上的用户都不同。
问题是我总是从settings.py(在localhost上运行)中定义的默认数据库中获取用户列表,而不是从mysql 1服务器然后从mysql 2服务器获取用户列表。
知道我在这里做错了吗?
劳伦
答案 0 :(得分:1)
根据信息,我的猜测是你的DATABASE_HOST行中的潜在错误(在上面的yor伪代码中)。阅读:“setattr(设置......”
除此之外,我不确定您是如何根据自己的标准配置数据库进行切换的,因为您没有解释过这一点。如果你是按模型进行的,可能值得考虑Django如何知道这一点,或者甚至使用外部连接(手动加载数据库驱动程序并在渲染阶段之前手动运行命令),并使用main。
我会查询整个方法,但主要是因为我不确定你是如何区分这两个数据库的,或者为什么。你能提供一些关于你如何做的更多信息吗?我假设您在上面的点2和点5中拉出的变量是不同的。我不需要这些值,我只是确保你没有使用旧的代码重复并忘记编辑它(我们都在那里)。
注意:如果可以,我会将此作为评论发布,但我认为解决方案可能在于您如何提取变量。最后,您可以尝试将数据库名称(只是服务器IP或其他)添加到输出中,如果您处于'dev'/ debug(离线/非生产)模式,以检查它是否实际进入第二个服务器
答案 1 :(得分:1)
作为参考,Django documentation明确指出您不应该这样做 - Altering settings at runetime。
Django社区内有很多关于ORM同时支持多个连接/数据库的讨论。那里有很多很好的参考信息。看看这篇博文:Easy Multi-Database Support for Django和这个Django wiki页面Multiple Database Support。
在博文中,Eric Florenzano在他的settings.py文件中做了类似的事情:
DATABASES = dict(
primary = dict(
DATABASE_NAME=DATABASE_NAME,
# ...
),
secondary = dict(
DATABASE_NAME='secondary.db',
# ...
),
)