配置不正确:settings.DATABASES 配置不正确。请提供 ENGINE 值。

23

我正在为我的Django项目在Heroku上进行设置。我一直在按照文档的指导操作,但当我执行foreman start时,出现了一个错误,我无法完全理解。我已经设置好了我的引擎文件,但它似乎不想工作。

完整跟踪信息:

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/core/management/base.py", line 285, in execute
    output = self.handle(*args, **options)
  File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/core/management/base.py", line 415, in handle
    return self.handle_noargs(**options)
  File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 57, in handle_noargs
    cursor = connection.cursor()
  File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/db/backends/__init__.py", line 160, in cursor
    cursor = self.make_debug_cursor(self._cursor())
  File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/db/backends/dummy/base.py", line 15, in complain
    raise ImproperlyConfigured("settings.DATABASES is improperly configured. "
django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.

有人建议使用./manage.py diffsettings命令并显示DATABASES部分:
DATABASES = {'default': {'AUTOCOMMIT': True, 'ENGINE': 'django.db.backends.dummy', 'ATOMIC_REQUESTS': False, 'NAME': '', 'TEST_MIRROR': None, 'CONN_MAX_AGE': 0, 'TEST_NAME': None, 'TIME_ZONE': 'UTC', 'TEST_COLLATION': None, 'PORT': '', 'HOST': '', 'USER': '', 'TEST_CHARSET': None, 'PASSWORD': '', 'OPTIONS': {}}}

我似乎无法弄清它的含义,但表面上看起来不正确。
这是我认为与此问题相关的settings.py的一部分:
import os
import dj_database_url

ON_HEROKU = os.environ.get('ON_HEROKU')
HEROKU_SERVER = os.environ.get('HEROKU_SERVER')

if ON_HEROKU:
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'postgresql',
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            'USER': '',
            'PASSWORD': '',
            'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
            'PORT': '',  
        }
    }


DATABASES['default'] =  dj_database_url.config()

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

ALLOWED_HOSTS = ['*']

STATIC_URL = '/static/'

# only refers to the location where your static files should end up after running manage.py collectstatic. you shouldn't really need collectstatic) when developing locally
STATIC_ROOT = 'staticfiles'


STATICFILES_DIRS = (    
    os.path.join(BASE_DIR, '../static'),
)

5个回答

28
您正在使用dj-database-url模块来设置DATABASES['default']。在此行之前的所有内容都不重要。
DATABASES['default'] =  dj_database_url.config()

如果你完全更换了数据库配置,那么dj_database_url.config()就没有意义。该函数从DATABASE_URL环境变量加载数据库配置,如果该变量未设置,则返回{}

根据你的错误,你根本没有设置DATABASE_URL。根据dj_database_url.config()函数前面的代码,你根本不应该使用该函数。

如果你确实想使用它,至少要构建一个默认的URL:

if ON_HEROKU:
    DATABASE_URL = 'postgresql://<postgresql>'
else:
    DATABASE_URL = 'sqlite:///' + os.path.join(BASE_DIR, 'db.sqlite3')

DATABASES = {'default': dj_database_url.config(default=DATABASE_URL)}

8
您可以使用以下设置来配置本地服务器。
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'DatabaseName',
        'USER': 'DatabaseUserName',
        'PASSWORD': 'DatabaseUserpassword',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

1
但是你能用它进行生产吗? - David Rhoden

3

在使用 GitHub Actions 运行我的 GitHub 工作流程时,遇到了这个问题。因此,我找到了以下解决方法:

POSTGRES_DB = os.environ.get("POSTGRES_DB") #database name
POSTGRES_PASSWORD = os.environ.get("POSTGRES_PASSWORD") # database user password
POSTGRES_USER = os.environ.get("POSTGRES_USER") # database username
POSTGRES_HOST = os.environ.get("POSTGRES_HOST") # database host
POSTGRES_PORT = os.environ.get("POSTGRES_PORT") # database port


POSTGRES_READY = (
    POSTGRES_DB is not None
    and POSTGRES_PASSWORD is not None
    and POSTGRES_USER is not None
    and POSTGRES_HOST is not None
    and POSTGRES_PORT is not None
)

print(POSTGRES_READY)

if POSTGRES_READY:
    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.postgresql",
            "NAME": POSTGRES_DB,
            "USER": POSTGRES_USER,
            "PASSWORD": POSTGRES_PASSWORD,
            "HOST": POSTGRES_HOST,
            "PORT": POSTGRES_PORT,
        }
    }

接下来是你的.env文件:

export DEBUG=True
export DJANGO_SECRET_KEY=CI_CD_TEST_KEY
export POSTGRES_USER=taxi
export POSTGRES_PASSWORD=taxi
export POSTGRES_DB=pdm
export POSTGRES_PORT=5432
export POSTGRES_HOST=localhost

然后运行source .env


2

当我运行以下命令时,使用django-tenant-users出现了相同的问题:

python manage.py setup_dtu_tenants

这是因为我在项目文件夹中有一个名为“settings”的文件夹,它与我的settings.py处于同一级别。删除此文件夹后,问题解决了。


你的回答似乎与@ApathyBear分享的代码中出现的错误信息不匹配。请再次阅读问题。 - Serge de Gosson de Varennes
这似乎并没有回答这个问题,但它帮助了我解决了我的问题。问题在于我有一个名为myprojectname/settings/的文件夹用于我的设置和apps/settings应用程序。 - David

0

使用 "Django==3.1.7",在 "settings.py" 中使用以下代码时,我遇到了同样的错误:

# "settings.py"

from django.db import connection 

print(connection.queries) # Causes error

所以,我删除了如下所示的“print(connection.queries)”,然后错误就解决了:
# "settings.py"

from django.db import connection 

# print(connection.queries) # Causes error

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接