Django runserver自定义数据库

Gri*_*osx 14 django

我正在使用Django 1.4

我需要启动开发服务器,我想指定(在命令中)它必须使用的数据库.例如,如果我的设置包含:

DATABASES = {
    'default': {
        'NAME': 'db.db',
        'ENGINE': 'django.db.backends.sqlite3'
    },
    'tests': {
        'NAME': 'tests.db',
        'ENGINE': 'django.db.backends.sqlite3'
    },
}
Run Code Online (Sandbox Code Playgroud)

我想使用类似的东西:

django-admin.py runserver --database=tests
Run Code Online (Sandbox Code Playgroud)

有类似的东西?我也尝试使用第二个设置文件,但是--settings选项不起作用:( - 设置选项似乎已被弃用,在DOCS中根本没有提及)

django-admin.py runserver --settings=settings_tests
Run Code Online (Sandbox Code Playgroud)

要么

django-admin.py runserver --settings settings_tests
Run Code Online (Sandbox Code Playgroud)

引发错误:

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

非常感谢任何帮助,谢谢,

Griffosx

Dan*_*gen 20

切换配置比创建多个配置文件更清晰,更具可扩展性的方法是使用环境变量(参见Heroku和其他人使用的十二因素应用方法的#3).例如:

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]
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过设置DJANGO_DATABASE环境变量来更改默认数据库.

export DJANGO_DATABASE='tests'
./manage.py runserver
Run Code Online (Sandbox Code Playgroud)

...要么...

DJANGO_DATABASE='tests' ./manage.py runserver
Run Code Online (Sandbox Code Playgroud)

您还可以使用Python代码设置环境变量.


编辑:为了简化这个过程,Kenneth Reitz编写了一个名为dj-database-url的小应用程序.


Gri*_*osx 11

我发现在Django 1.4中调用的正确命令是:

django-admin.py runserver --settings=myproject.settings_tests
Run Code Online (Sandbox Code Playgroud)

Django DOCS中的这些信息在哪里?

感谢您的回复

Griffosx


Cac*_*aco 7

@Danilo Barges 提出了一个简单的方法来解决这个问题。我只添加一些更改来处理运行测试。那是因为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]
}
Run Code Online (Sandbox Code Playgroud)


var*_*tec 5

settings_tests.py使用以下内容创建:

from settings import *

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

}
Run Code Online (Sandbox Code Playgroud)

执行 django-admin.py runserver --settings=settings_tests