#python #django #exception
#python #django #исключение
Вопрос:
Я использую несколько баз данных, и мне нужно обработать это исключение. Как я могу сделать это либо в представлении, либо в более общем подходе? Я использую PostgreSQL. Немного некрасиво переносить весь мой код, как показано ниже.
import psycopg2
def Main(request):
try:
myqs = customers.objects.all()
except psycopg2.OperationalError as e:
print('operational error, handle this')
return render(request, 'core/main/main.html', {'qs': myqs})
Ответ №1:
Это более общее решение. Однако я не уверен, как проверить, в какой базе данных произошла ошибка. Любые комментарии / ответы помогут
from django.db.utils import OperationalError
def db_operational_handler(func):
def inner_function(*args, **kwargs):
try:
func(*args, **kwargs)
except OperationalError:
return HttpResponse('Error Establishing a DB connection')
return inner_function
@db_operational_handler
def Main2(request):
myqs = customers.objects.all()
return render(request, 'core/main/main.html', {'qs': myqs})
Ответ №2:
Django поддерживает несколько баз данных, но это больше предназначено для разделения приложения на несколько хранилищ, таких как база данных аутентификации и база данных содержимого. См. раздел Маршрутизация базы данных.
Я действительно не вижу хорошего способа перенести отработку отказа в одну точку в Django. Я думаю, что это сознательный выбор Django, поскольку для этого есть более подходящие инструменты на уровне самой базы данных, такие как pgBouncer. Этой теме посвящен целый раздел руководства. Это решение будет означать, что у вас есть 1 подключение к балансировщику нагрузки, который автоматически выбирает из пула доступных серверов.