15

我正在使用 Django 1.4

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

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:无法导入设置“settings_tests”(它在 sys.path 上吗?):没有名为 settings_tests 的模块

4

4 回答 4

29

与创建多个配置文件相比,切换配置的一种更简洁、更具可扩展性的方法是使用环境变量(参见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]

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

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

...或者...

DJANGO_DATABASE='tests' ./manage.py runserver

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


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

于 2012-06-25T12:27:19.780 回答
12

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

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

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

感谢您的所有回复

狮鹫

于 2012-06-25T13:37:03.643 回答
5

使用以下内容创建settings_tests.py

from settings import *

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

}

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

于 2012-06-25T10:12:49.903 回答
4

@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]
}
于 2018-01-11T10:55:00.110 回答