2012-06-25 6 views
10

Я использую Django 1.4Django runserver пользовательских баз данных

мне нужно запустить сервер разработки, и я хочу, чтобы указать (в командном) базах данных которым он должен использовать. Например, если мои настройки содержит:

DATABASES = { 
    'default': { 
     'NAME': 'db.db', 
     'ENGINE': 'django.db.backends.sqlite3' 
    }, 
    'tests': { 
     'NAME': 'tests.db', 
     'ENGINE': 'django.db.backends.sqlite3' 
    }, 
} 

Я хочу использовать что-то вроде:

django-admin.py runserver --database=tests 

Там есть что-то подобное? Я также попытался использовать второй файл настроек, но опция --settings не работает: (--settings вариант, кажется устаревшим, в DOCS нет никакого упоминания вообще)

django-admin.py runserver --settings=settings_tests 

или

django-admin.py runserver --settings settings_tests 

вызывает ошибку:

ImportError: Could not import settings 'settings_tests' (Is it on sys.path?): No module named settings_tests 

Любая помощь очень ценится, спасибо,

Griffosx

ответ

8

я обнаружил, что правая команда для вызова в Django 1.4:

django-admin.py runserver --settings=myproject.settings_tests 

Где эта информация в Django DOCS?

Спасибо за ваш ответ

Griffosx

2

Создать settings_tests.py со следующими:

from settings import * 

DATABASES = { 
    'default': { 
     'NAME': 'tests.db', 
     'ENGINE': 'django.db.backends.sqlite3' 
    }, 

} 

Execute django-admin.py runserver --settings=settings_tests

+0

Это не работает. Я уже пробовал это решение, но оно вызывает исключение выше. Я использую Django 1.4 – Griffosx

+0

, как вы можете получить исключение «нет модуля», он вы только что создали этот модуль? – vartec

+0

Ну, на самом деле ошибка 'ImportError: не удалось импортировать настройки 'settings_tests' (это на sys.path?): Нет модуля с именем settings'. Я уже добавил файл settings_test.py в корневой каталог проекта (на том же уровне settings.py). Ошибка связана с _module_ не о _file _... – Griffosx

16

очистителя и более масштабируемый способ переключения конфигураций, чем создавать несколько конфигурационных файлов будет использовать переменные окружения (см #3 of the twelve-factor app methodology используется Хереку и другие). Например:

from os import environ 

DATABASES = { 
    'main': { 
     'NAME': 'db.db', 
     'ENGINE': 'django.db.backends.sqlite3' 
    }, 
    'tests': { 
     'NAME': 'tests.db', 
     'ENGINE': 'django.db.backends.sqlite3' 
    }, 
} 

default_database = environ.get('DJANGO_DATABASE', 'main') 
DATABASES['default'] = DATABASES[default_database] 

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

export DJANGO_DATABASE='tests' 
./manage.py runserver 

... или ...

DJANGO_DATABASE='tests' ./manage.py runserver 

Вы также можете установить переменные окружения, используя код Python.


Edit: Для того, чтобы сделать этот процесс проще, Кеннет Рейцы написали миленькое приложение под названием dj-database-url.

+0

Интересно, но я предпочитаю использовать параметр --settings. Спасибо – Griffosx

+0

Это решение помогло мне сохранить тот же файл settings.py для производства и разработки, при этом база данных для производства выбирается путем установки переменной среды вне приложения. Потрясающие! – shaffooo

0

@Danilo Баржа поставить простой способ решить эту проблему. Я только добавляю несколько изменений, чтобы иметь дело с запусками тестов. Это потому, что DATABASES['default'] = DATABASES[default_database] добавит запись в словарь DATABASES.Поэтому, если вы запускаете тесты, тестовый бегун будет работать против 'default' и следующей записи в DATABASES. Вместо этого используйте два словаря:

DATABASES_AVAILABLE = { 
    'default': { 
     'NAME': 'db.db', 
     'ENGINE': 'django.db.backends.sqlite3' 
    }, 
    'tests': { 
     'NAME': 'tests.db', 
     'ENGINE': 'django.db.backends.sqlite3' 
    }, 
} 

database = os.environ.get('DJANGO_DATABASE', 'main') 
DATABASES = { 
    'default': DATABASES_AVAILABLE[database] 
} 
Смежные вопросы