2013-07-17 2 views
0

Ну, у меня есть проект django, который отлично работает сейчас.django alter settings для одного приложения

Я хотел бы добавить к нему новое приложение, в котором мне нужно получить доступ к нескольким базам данных.

Я знаю, что Django поддерживает несколько параметров баз данных и знает, как его настроить. Это не проблема.

Проблема в том, что в 90% моих компонентов проекта мне не нужно поддерживать несколько параметров базы данных. Единственное использование для вторых баз данных - в новом добавленном приложении.

Так что я попытался изменить настройки по телефону:

django.conf.settings.configure(DATABASES = {....}) 

в новом приложении. И Джанго сказал:

RuntimeError: Settings already configured. 

Который имеет смысл, так как у меня есть файл настроек происхождения и установить DJANGO_SETTINGS_MODULE вверх.

Поэтому я сомневаюсь, что в этом случае должен быть хороший подход.

  1. Я не хочу отбрасывать переменную DJANGO_SETTINGS_MODULE.
  2. Сначала я пытаюсь не включать вторую базу данных в файл настроек, так как новое приложение также является независимым модулем, который должен работать независимо от проекта django. Поэтому я хочу иметь аналогичную конфигурацию в новом приложении для настройки конфигурации базы данных.

У кого-нибудь есть идеи?

Заранее благодарен!

+0

Для нескольких баз данных, вы можете установить [Database Routers] (https://docs.djangoproject.com/ en/dev/themes/db/multi-db/# database-routers) для этой цели. A [пример использования] (http://stackoverflow.com/a/12548439/1628832) – karthikr

ответ

2

На самом деле, у меня такая же проблема в текущем проекте. Поскольку у меня есть абсолютно независимое приложение, которое использует другую базу данных, и у меня могут быть другие приложения, которые могут иметь такое же поведение.

Дело в том, что я сделал это, чтобы создать реж приложения, где я храню свои приложения, а затем я добавляю это в конце моего settings.py файла:

DATABASE_ROUTERS = ['myproject.routers.MultiDBRouter'] 
import os 
APPS_DIR = os.path.join(PROJECT_ROOT, 'apps') 
for app_name in os.listdir(APPS_DIR): 
    print '\nLooking for settings in apps/%s :' % app_name 
    if os.path.exists(os.path.join(APPS_DIR, app_name, 'settings.py')): 
    print ' Settings file found...' 
    app = __import__('%s.settings' % app_name) 

    content = dir(app.settings) 
    if 'DATABASES' in content: 
     print ' Adding databases :' 
     for key, value in app.settings.DATABASES.iteritems(): 
     if DATABASES.has_key(key): 
      print ' Can not add %s database config, because it already exists' % key 
     else: 
      DATABASES[key] = value 
      DATABASES[key]['APPS'] = [app_name] 
      print ' Added %s database config' % key 

Он будет автоматически следить за настройками. py во всех приложениях/myapp/каталогах. Если он найдет новую переменную DATABASES в файле app/myapp/settings.py, она добавит другие конфигурации базы данных в вашу переменную DATABASES (истинную).

Я также создал маршрутизатор, которому не нужно использовать команду using (MultiDBRouter).

А потом добавить settings.py файл во всех которых приложение требует другой базы данных:

DATABASES = { 
    'db': { 
    'ENGINE': 'django.db.backends.mysql', 
    'NAME': 'database', 
    'USER': 'username', 
    'PASSWORD': 'mysecretpassword', 
    } 
} 
+0

Это звучит интересный подход. Позвольте мне изучить это. –

Смежные вопросы