Исключения базы данных Django

Исключения Django импортируются из django.db. Эти классы исключений включают;

  • Ошибка
  • Операционная ошибка
  • Ошибка интерфейса
  • Ошибка базы данных
  • Ошибка данных
  • IntegrityError
  • ProgrammingError
  • Неподдерживается ошибка

Мы будем использовать следующую модель, чтобы проиллюстрировать различные типы исключений базы данных в django.

from django.db import models

class Member(models.Model):
    first_name = models.CharField(max_length = 100)
    last_name = models.CharField(max_length = 100)
    email = models.EmailField(max_length = 10)
    address = models.CharField(max_length = 10)
    mobile = models.IntegerField(default=0)

class Entry(models.Model):
    title = models.CharField(max_length= 100)
    description = models.TextField(max_length= 100)
    date_added = models.DateTimeField(auto_now_add=True)

Ошибка

Это базовый класс, от которого наследуются другие исключения. Вы можете использовать это исключение, чтобы поймать любую ошибку, как показано ниже.

from django.db import Error
def error_function():
    try:
        
# code that causes an error
    except Error as e:
        print(e.message)

Операционная ошибка

OperationalError — это ошибка, связанная с самой базой данных. OperationError является подклассом DatabaseError. Подключения к базе данных и выделение памяти во время обработки данных — вот некоторые проблемы, которые могут вызвать операционную ошибку. Например, OperationalError может возникнуть, когда ваше приложение Django пытается записать или запросить несуществующую таблицу данных.

В качестве другого примера, если вы внесете новые изменения в свои модели и не сможете выполнить миграцию, вы получите OperationalError.

return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: members_members

Ошибка интерфейса

InterfaceError вызывается ошибками, связанными с интерфейсом базы данных, а не с самой базой данных. Это может произойти, когда ваше приложение Django пытается выполнить запрос к уже закрытому соединению с базой данных.

Ошибка данных

Как следует из названия, DataError вызывается обработанными данными. Используя нашу модель Member, давайте добавим нового члена.

>>> from members.models import Member
>>> Member.objects.create(first_name='joe', last_name='doe',email ='[email protected]',address= '1234 Street',mobile = 123456788)

Результат показан ниже.

django.db.utils.DataError: value too long for type character varying(10)

Ошибка возникает из-за использования большего количества символов, чем может вместить адресное поле. Чтобы устранить эту ошибку, обновите атрибут max_length.

address = models.CharField(max_length = 100)

IntegrityError

IntegrityError — тип ошибки, возникающий при нарушении целостности отношения Django, например, нарушение уникального поля при сохранении данных в базу данных. Например, если поле имени пользователя модели пользователя ожидает уникальное имя, а база данных получает такое же имя пользователя, база данных вызовет ошибку IntegrityError.

Это также может быть вызвано нарушением уникальности первичного ключа. Первичные ключи в Django должны быть уникальными. Однако если вы нарушите это правило с помощью метода get_or_create_method, запрос приведет к ошибке IntegrityError.

Используя нашу модель входа, это выглядит так:

class Entry(models.Model):
  title = models.CharField(max_length= 100)
  description = models.TextField(max_length= 100)
  date_added = models.DateTimeField(auto_now_add=True)
  date_updated = models.DateTimeField()

Давайте создадим новую запись.

>>> from board.models import Entry
>>> entry = Entry(title = 'First title', description = 'This is my first entry')
>>> entry.save()

Если вы сохраните вышеуказанную запись, вы получите сообщение IntegrityError.

sqlite3.IntegrityError: NOT NULL constraint failed: board_entry.date_updated

Ошибку выше вызывает поле date_updated, которое мы не заполнили никаким значением. По умолчанию Django сохраняет пустые значения как NULL в базе данных, поэтому нам нужно установить null = True для этого конкретного поля.

date_updated = models.DateTimeField(blank =True, null =True)

ProgrammingError

Исключение ProgrammingError вызывается базой данных. Это может быть вызвано:

  • синтаксические ошибки в запросах
  • таблица не найдена или уже существует
django.db.utils.ProgrammingError: column "user_id" of relation "members_member" does not exist

Ошибка выше вызвана записью в несуществующую таблицу. Это легко решается путем применения миграций после создания или обновления моделей.

Несуппортедеррор

NotSupportedError возникает, если вы используете метод или API, не поддерживаемые базой данных. Например, блок кода, реализующий функцию rollback(), выдаст эту ошибку, если транзакции отключены. Вы также можете получить эту ошибку, если используете более старые версии бэкэндов баз данных, которые Django не поддерживает.

Ошибка базы данных

Ошибка DatabaseError возникает для всех ошибок, связанных с базой данных. Все ошибки, которые мы обсуждали выше, являются подклассом DatabaseError. Это DataError, OperationalError, IntegrityError, ProgrammingError и NotsupportedError.

Обработка ошибок при загрузке формы

Предположим, у вас есть CSV-файл, содержащий около 10 000 записей, которые необходимо сохранить в следующей модели Django.

class Employment(models.Model):
    reference = models.CharField(max_length=255,blank=False,null=False)
    period = models.CharField(max_length=255,blank=False,null=False)
    value = models.CharField(max_length=255,blank=False,null=False)
    status = models.CharField(max_length=255,blank=False,null=False)
    units = models.CharField(max_length=255,blank=False,null=False)
    group= models.CharField(max_length=255, blank= False ,null=False)
   

Поскольку это очень ресурсоемкая операция с базой данных, рекомендуется реализовать и обработать любые ошибки, которые могут возникнуть при сохранении данных в базе данных. Код для добавления данных может выглядеть так:

from .models import Employment
import csv

def upload_data(request):
    try:
        with open('images/employment.csv') as csv_file:
            csv_reader = csv.reader(csv_file, delimiter=',')
            for row in csv_reader:
                Employment.objects.create(
                reference = row[0] ,period = row[1],value = row[2], status = row[3],
                units = row[4],group= row[5] ,title =row[6])
                logger.info('Uploaded Csv file')
        return HttpResponse('data uploaded')
    except DatabaseError as e:
        logger.error('DatabaseError %s' ,e)
        
        return HttpResponse("Error uploading file",e)

Как видите, в приведенном выше коде мы правильно настроили обработку ошибок в функции upload_data(). Любая ошибка, возникшая в результате операции, будет незаметно обработана и зарегистрирована.

Заключение

Для получения дополнительной информации посетите Django docs.