【问题标题】:Django modify DATABASE_HOST at runtimeDjango 在运行时修改 DATABASE_HOST
【发布时间】:2009-11-09 23:53:40
【问题描述】:

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

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

劳伦特

【问题讨论】:

标签: mysql database django host


【解决方案1】:

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

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

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

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

【讨论】:

  • 我更新了我的帖子以包含更详细的代码版本。我在 mysql1 和 mysql2 上运行相同的数据库,但内容不同。我应该得到一个不同的用户列表,但我得到的是相同的,来自 localhost 的用户列表是我在 settings.py 中定义的默认数据库
  • 所以我的问题变成了:“内容如何区分”?如果系统知道在哪里更新到 DB1 或 DB2(也不确定您是如何使用那个的!),那么它提取信息的方式应该以相同的方式完成。您基本上是在使用两个身份验证服务器(MySQL 服务器)吗?如果是这样,除非您有很多用户,否则我会问为什么,即使这样,您也可以简单地覆盖身份验证模型。如果是为了其他原因,了解原因同样重要。假设如果是博客,它会是按部分;所以切换视图?
  • 我正在尝试将数据从一个数据库迁移到另一个数据库(2 个不同的服务器)。
【解决方案2】:

作为参考,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',
        # ...
    ),
)

【讨论】:

  • 我知道这些链接,但是当您只需要一个临时解决方案时,它们会非常复杂。我更喜欢使用 settings.py 快速破解我需要移动的内容,然后完成它。
  • Eric 所做的与我尝试做的不同。他将一个模型关联到数据库 A,将第二个模型关联到数据库 B。我想在 2 个不同的数据库上使用相同的模型。
  • 如果您查看 Eric 的帖子。他也在运行时修改设置:setattr(settings, key, value)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多