2012-05-30 3 views
4

Я работаю с приложением django с несколькими базами данных - динамически добавлено несколько баз данных. Каждый раз, когда новый клиент подписывается, мы даем им новую базу данных. Файл настроек может загружать их динамически (как в, я запускаю сценарий оболочки на сервере и который обновляет определение баз данных без изменения кода), если вам действительно интересно, как мне сообщать), но поскольку uwsgi/django кэширует настройки , Я должен поднять uwsgi только для того, чтобы получить новую базу данных.недействителен кэш настроек django без перезапуска сервера?

Любые советы по принудительному django для перезагрузки настроек или аннулирования кеша настроек? Это может быть из командной строки и т. Д. На данный момент я использую import settings , а не от django.conf import settings, потому что это прошлое в прошлом, но я могу легко переключиться обратно.

Спасибо!

пса - если ответ, «Вы болван, не использовать динамические несколько баз данных» хорошо, это нормально тоже;)

+0

Не добавлять это как ответ, просто чтобы убедиться, что это не глупо, но если вместо того, чтобы этот скрипт вы сделать что-то вроде 'от настроек django.conf импорта; settings.DATABASES [new_name] = new_db_definition? – Lacrymology

+0

Очевидно, что настройки редактирования «на лету» являются основными НЕТ-НЕТ, и я действительно не уверен, почему. Возможно, потому, что это отредактирует его для отдельного запроса, но не для кешированной версии на сервере. Наличие разных настроек для запроса приведет к непредсказуемому поведению ... –

ответ

1

Прежде всего. Если вы можете уйти из нескольких баз данных DO, Django поддерживает это хорошо, только если список баз данных исправлен. Если вы можете позволить себе отдельный БД на клиента, вы, вероятно, можете позволить себе отдельные процессы wsgi (и отдельные настройки DATABASES) для разных клиентов. Затем вы просто создаете новый процесс wsgi для нового клиента и не должны изменять настройки.

Если вы все еще хотите делать то, что планируется, вот несколько советов:

Перегрузочные настройки динамически не вариант. Там есть много проблем. Даже если вы будете бороться со всеми, они могут вернуться в тот момент, когда вы не ожидаете, и вы будете тратить часы (если не на дни) на отладку.

Если ваши настройки базы данных согласованы (т.е. одинаковый пароль и пользователь для всех клиентов), вы можете рассмотреть возможность использования defaultdict для переменной DATABASES. По умолчанию dict имеет заводскую настройку. Вы можете иметь на заводе что-то вроде этого:

def database_configuration_factory(name): 
    # check if database exists (ie. raw SQL) 

    return { 
     'NAME': name, 
     ... 
    } 
+0

Это классная идея! Я попробую сейчас и отчитаюсь. –

+0

Я реализовал это, как описано, хотя это предотвращает отсутствие ошибки определения базы данных, кажется, что на самом деле она не создает базу данных _connection_. В результате все запросы возвращаются пустым. И, глядя на журнал отладки, кажется, что запрос базы данных вообще не выполняется. Интересная идея. У меня есть чувство, что мне придется перестроить, как мы обрабатываем клиентские базы данных, потому что я не думаю, что десятки-сотни экземпляров uwsgi - это вариант. –

+0

Доступны ли базы данных десятков-hundrets и подключение к базе данных десятков-hundrets? –