Django изменяет DATABASE_HOST во время выполнения - PullRequest
1 голос
/ 10 ноября 2009

Я пытаюсь переключаться между двумя серверами 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.

Есть идеи, что я здесь не так делаю?

Laurent

Ответы [ 2 ]

1 голос
/ 10 ноября 2009

Для справки, в документации Django прямо говорится, что вы не должны этого делать - Изменение настроек во время выполнения .

В сообществе Django много говорят о том, что ORM поддерживает несколько соединений / баз данных одновременно. Там много хорошей справочной информации. Прочтите этот пост в блоге: Простая поддержка нескольких баз данных для Django и эта вики-страница Django Поддержка нескольких баз данных .

В своем блоге Эрик Флорензано делает что-то подобное в своем файле settings.py:

DATABASES = dict(
    primary = dict(
        DATABASE_NAME=DATABASE_NAME,
        # ...
    ),
    secondary = dict(
        DATABASE_NAME='secondary.db',
        # ...
    ),
)
1 голос
/ 10 ноября 2009

Я думаю, исходя из информации, будет потенциальная ошибка в ваших установленных строках DATABASE_HOST (в вашем псевдокоде выше). читать: "setattr (settings ..."

Кроме этого, я не уверен, как вы настроили свою базу данных для переключения на основе ваших критериев, поскольку вы этого не объяснили. Если вы делаете это по модели, возможно, стоит подумать о том, как Django это знает, или даже использовать внешние соединения (ручная загрузка драйвера базы данных и выполнение команд вручную до этапа рендеринга) и использование main.

Я бы поставил под вопрос весь подход, но в основном потому, что я не уверен, как вы на самом деле различаете две базы данных или почему. Не могли бы вы предоставить немного больше информации о том, как вы это делаете? Я предполагаю, что переменные, которые вы выводите в точках 2 и 5 выше, разные. Мне не нужны значения, я просто проверяю, что вы не использовали старое дублирование кода и забыли отредактировать его (мы все были там).

Примечание: я бы опубликовал это как комментарий, если бы мог, но я думаю, что решение может быть в том, как вы вытягиваете переменные. Наконец, вы можете попробовать добавить имя базы данных (только IP-адрес сервера или что-то еще) к выводу, если вы находитесь в режиме 'dev' / debug (автономный / непроизводственный), чтобы проверить, действительно ли он делает это для второго сервер.

...