Django在运行时修改DATABASE_HOST

时间:2009-11-09 23:53:41

标签: mysql database django host

我试图在运行时在两个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服务器获取用户列表。

知道我在这里做错了吗?

劳伦

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',
        # ...
    ),
)