为什么Django说我还没有设置DATABASE_ENGINE?

3 投票
3 回答
4082 浏览
提问于 2025-04-15 16:58

我有一个Django项目,还是个新手。现在我有一个PyUnit测试,想把一个对象保存到PostgreSQL数据库里:

import unittest

from foo.models import ObjectType

class DbTest(unittest.TestCase):
    def testDBConnection(self):
        object_type = ObjectType()

        object_type.name = 'Test Object'
        object_type.description = 'For testing purposes'

        object_type.save()

我的数据库设置是这样的:

DATABASE_ENGINE = 'postgresql_psycopg2'           
DATABASE_NAME = 'FOO'             
DATABASE_USER = 'username'            
DATABASE_PASSWORD = 'password'         
DATABASE_HOST = 'localhost'            
DATABASE_PORT = '5432'    

我运行了python manage.py syncdb这个命令,项目也成功执行了,所以我的数据库应该设置得不错。但是当我尝试运行上面的单元测试时,却遇到了以下错误:

文件 "C:\Python26\lib\site-packages\django\db\backends\dummy\base.py", 第15行,在complain raise ImproperlyConfigured, "你还没有设置DATABASE_ENGINE 设置。" ImproperlyConfigured: 你还没有设置DATABASE_ENGINE 设置。

有没有人遇到过类似的问题?如果有,能给点建议从哪里开始吗?谢谢!

3 个回答

2

你可以设置一个环境变量,叫做 DJANGO_SETTINGS_MODULE,并把它的值设为 myapp.settings,这样在独立的脚本中就能正常工作了。

在 Linux 或者 bash 里,你可以这样做:export DJANGO_SETTINGS_MODULE=myapp.settings

2

在你导入模型之前,Django的设置文件必须先加载。如果你不能使用Django的测试框架,那么你可以在测试中使用下面的代码:

from django.conf import settings
settings.configure(
        DATABASE_ENGINE='postgresql_psycopg2',
        DATABASE_NAME='FOO',
        DATABASE_USER='username',
        DATABASE_PASSWORD='password',
        DATABASE_HOST='localhost',
        DATABASE_PORT='5432',
        INSTALLED_APPS=('foo',)

)

或者,如果你不想那么明确,你可能只需要这样做:

import django.core.management
from foo import settings
django.core.management.setup_environ(settings)
3

这可能是因为你直接运行测试,比如说用 python testfile.py 这样的方式。这样做的话,你就绕过了Django的所有机制,直接使用了模型类。这样做的缺点是,数据库连接没有被自动设置好(Django会加载 settings.py 并连接到合适的数据库),所以你才会遇到错误。

其实,你应该通过Django的测试框架来运行测试(可以看看文档)。这样可以确保数据库连接设置正确等等。而且还有一些很酷的功能,比如测试数据的准备。

撰写回答