Является ли эта логика в Settings.py в отношении базы данных редуцированной
В настройках проекта Django, над которым я работаю, DATABASES настроен именно таким образом. Человек, написавший это, объяснил, что оператор if - это излишество, которое не имеет смысла для меня. Насколько я понимаю, если try
не работает, то if
тоже не работает, потому что они одинаково устанавливают 'default'? Является ли это утверждение if избыточным:
try:
DATABASES = {
'default': env.db(),
}
except environ.ImproperlyConfigured:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Override with DATABASE_URL if it exists
if env('DATABASE_URL', default=None):
DATABASES['default'] = env.db()
А если нет, может ли кто-нибудь объяснить мне, почему?
Спасибо за любые разъяснения.
Я пробовал использовать пустое значение для DATABASE_URL, но, похоже, это не имеет значения, есть ли там if или нет.
Пожалуйста, не давайте мне тот же ответ, что и в ChatGPT, потому что после двух вопросов он говорит, что это лишнее.
Давайте разберем ваш код построчно:
try:
DATABASES = {
'default': env.db(),
}
except environ.ImproperlyConfigured:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
Если env.db()
не удастся, то будет создана резервная копия базы данных sqlite3, если нет, то 'default'
будет установлено значение env.db()
return, которое является str url базы данных.
При настройке базы данных может произойти сбой и будет вызвано исключение, но затем ваш код перестанет выполняться и покажет вам обратную трассировку.
В тот момент, когда вы if env('DATABASE_URL', default=None):
, эта переменная окружения уже была проверена, и если она существует, то уже установлена в качестве вашей 'database'
.
TL;DR: Вы правы. Вы можете свободно удалить свое if
заявление как лишнее
Блок if
является избыточным, потому что:
Если блок try
не throw
, [1]значения env.db()
будут успешно использованы, поэтому повторение одного и того же вызова env.db()
в блоке if
является излишним.
If it throw
s, the exception is handled gracefully in the except
block and an alternative is used. Making another invocation to env.db()
[2] which just threw the handled exception will raise another exception that is not handled.
[1] The assumption is that invoking env.db()
might throw exceptions.
[2] The assumption is that env('DATABASE_URL', default=None)
allowed another invocation of env.db()
which doesn’t seem likely but was assumed for educational purposes.