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
.