Djangotesting不同的数据库?

DATABASES = { # 'default': { # 'ENGINE': 'postgresql_psycopg2', # ... # } # for unit tests 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'mydatabase' } } 

我有两个数据库:一个我想用于unit testing,一个用于其他的。 有没有可能在Django 1.2.4中configuration?

(我问的原因是因为与postgresql我得到以下错误:

 foo@bar:~/path/$ python manage.py test Creating test database 'default'... Got an error creating the test database: permission denied to create database Type 'yes' if you would like to try deleting the test database 'test_baz', or 'no' to cancel: yes Destroying old test database... Got an error recreating the test database: database "test_baz" does not exist 

为什么我会得到这个错误? 我想我真的不在乎我是否总是可以使用SQLite进行unit testing,因为这很好。)

在您的settings.py (或local_settings.py )中:

 import sys if 'test' in sys.argv: DATABASES['default'] = { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'mydatabase' } 

我处理这个问题的方法是通过具有多个设置文件,因为我使用它来维护一组通用设置,并对每个实例进行修改。 比其他一些解决scheme的设置稍微复杂一点,但我仍然需要这样做,因为我对本地开发,远程开发,分期和生产的pipe理略有不同。

https://code.djangoproject.com/wiki/SplitSettings有许多pipe理设置的选项,我select了一个类似于https://code.djangoproject.com/wiki/SplitSettings#SimplePackageOrganizationforEnvironments

所以,在我的Django项目目录中,我有一个如下所示的设置文件夹:

 $ tree settings settings ├── defaults.py ├── dev.py ├── dev.pyc ├── __init__.py ├── lettuce.py ├── travis.py ├── unittest.py 

常见的设置是在settings / defaults.py中,我将它们导入到我的实例设置文件中。 所以settings / unittest.py看起来像这样:

 from defaults import * DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'my_database', } } 

然后,当我想运行testing,我只是执行:

 $ ./manage.py test --settings=settings.unittest 

使用sqlite进行testing。 如果我想使用不同的testing运行器或数据库configuration,我将使用不同的设置模块。

这加速了testing的执行。

 import sys if 'test' in sys.argv: DATABASES['default'] = { 'ENGINE': 'django.db.backends.sqlite3', 'TEST_CHARSET': 'UTF8', # if your normal db is utf8 'NAME': ':memory:', # in memory 'TEST_NAME': ':memory:', # in memory } DEBUG = False # might accelerate a bit TEMPLATE_DEBUG = False from django.core.management import call_command call_command('syncdb', migrate=True) # tables don't get created automatically for me 

如果你有手动创build数据库的权限,你可以使用django-nose作为你的TEST_RUNNER。 一旦安装,如果你传递下面的环境variables,它不会删除并重新创build数据库。

 REUSE_DB=1 ./manage.py test 

您还可以将以下内容添加到settings.py中,以便您不必在每次运行testing时都写REUSE_DB = 1。

 os.environ['REUSE_DB'] = "1" 

注意:这也会将所有表保留在数据库中,这意味着testing设置会更快一些,但是当您更改模型时, 您将不得不手动更新表 (或者自己删除并重新创build数据库)。

虽然这已经解决了…

如果你的数据库testing只是一个正常的数据库:

因为你依赖于数据库,所以我认为你没有进行unit testing。 无论如何,Django包含一个testingtypes(不单一): django.test.TestCase

您需要从django.test.TestCase派生而不是unittest.TestCase ,它将为您创build一个新的rehershal数据库,在testing结束时将被销毁。

在下面的链接中有关于使用db进行testing的有趣的解释/提示
testingDjango应用程序

为什么我会得到这个错误?

由于权限不足 您可以通过ALTER USER username CREATEDB;更改用户权限ALTER USER username CREATEDB; 在超级用户priviliges运行psql后。

例,

 $ sudo su - postgres $ psql psql (9.3.18) Type "help" for help. postgres=# ALTER USER username CREATEDB; ALTER ROLE