KeyError: 'DB_NAME' при выполнении makemigrations в django

Я храню все свои секреты и параметры базы данных в файле dev.env. У меня есть 3 разных файла настроек - base, dev и prod. В base есть база данных SQLite, а в dev я хочу подключиться к Postgres.

Итак, я загружаю свои секреты с переменной окружения в моем файле настроек dev следующим образом:

from dotenv import load_dotenv
load_dotenv(os.environ.get('ENV_CONFIG', ''))

И я переопределяю настройки базы данных в файле настроек dev:

    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ['DB_NAME'],
        'USER': os.environ['DB_USER'],
        'PASSWORD': os.environ['DB_PASS'],
        'HOST': os.environ['DB_HOST'],
        'PORT': os.environ['DB_PORT'],
    }
}

Но когда я запускаю makemigrations с файлом dev settings:

./manage.py makemigrations --settings=app.settings.dev

Я получаю ошибку:

File "/Users/admin/Desktop/Programming/Python/UkranianFunds/src/app/settings/dev.py", line 35, in <module>
    'NAME': os.environ['DB_NAME'],
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'DB_NAME'

Я проверил, и мой секрет с ключом DB_NAME четко отображается в файле настроек - я успешно распечатал его. Имя базы данных правильное.

Каковы другие причины, вызывающие это?

Я думаю, что вы получили эту ошибку, потому что вы не использовали 'get':

Просто вы можете попробовать следующее:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.environ.get('DB_NAME'),
        'USER': os.environ.get('DB_USER'),
        'PASSWORD': os.environ.get('DB_PASS'),
        'HOST': os.environ.get('DB_HOST'),
        'PORT': os.environ.get('DB_PORT'),
    }
}

А также я заменил квадратные скобки на круглые.

Посмотрите, решит ли это вашу ошибку

Ваш загруженный файл dev.env не содержит 'DB_NAME' в качестве ключа.

Я решил эту проблему, заменив os.environ['DB_NAME'] на os.environ.get('DB_NAME').

Странная ситуация для меня, потому что проблема возникла только тогда, когда я сделал makemigrations.

После перехода на Postgres я попробовал запустить приложение с os.environ['DB_NAME'] и оно прекрасно работало.

Похоже, что KeyError поднимается только во время makemigrations.

Вернуться на верх