1

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

知道我在这里做错了什么吗?

洛朗

4

2 回答 2

1

作为参考,Django 文档明确指出您不应该这样做——在 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',
        # ...
    ),
)
于 2009-11-10T01:47:34.307 回答
1

根据信息,我的猜测可能是您设置的 DATABASE_HOST 行中的潜在错误(在您上面的伪代码中)。阅读:“setattr(设置...”

除此之外,我不确定您如何将数据库配置为根据您的条件进行切换,因为您没有对此进行解释。如果你是按模型来做的,那么可能值得考虑 Django 是如何知道这一点的,或者甚至使用外部连接(在渲染阶段之前手动加载数据库驱动程序并手动运行命令),并使用 main.

我会查询整个方法,但主要是因为我不确定您实际上是如何区分这两个数据库的,或者为什么。你能提供更多关于你是如何做到这一点的信息吗?我假设您在上面的点 2 和 5 中引入的变量是不同的。我不需要这些值,我只是确保您没有使用旧代码重复并忘记对其进行编辑(我们都去过那里)。

注意:如果可以的话,我会将此作为评论发布,但我认为解决方案可能在于您如何提取变量。最后,如果您处于“开发”/调试(离线/非生产)模式,您可以尝试将数据库名称(只是服务器 IP 或其他)添加到输出中,以检查它是否真的进入了第二个服务器。

于 2009-11-10T00:30:27.420 回答