Исключение DataError
Исключение DataError относится к подмодулю django.db
и наследуется от DatabaseError. Оно возникает, когда
передаваемые в запрос данные не соответствуют ожидаемому
типу, формату или ограничениям поля базы данных. Например,
попытка вставить слишком длинную строку в поле с ограничением
по длине или передача некорректного числового значения
в целочисленное поле вызывает данное исключение.
Синтаксис
from django.db import DataError
from django.db import models
Пример
Рассмотрим модель Book, в которой поле 'isbn'
имеет максимальную длину 13 символов. При попытке
сохранить книгу с ISBN длиннее 13 символов будет
выброшено исключение DataError:
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
isbn = models.CharField(max_length=13)
pages = models.IntegerField()
# Попытка сохранить книгу с длинным ISBN
book = Book(
title="Django for Beginners",
isbn="978-1-4493-3410-7-extra", # Длиннее 13 символов
pages=350
)
try:
book.save()
except DataError as e:
print("DataError caught:", e)
Результат выполнения кода:
"DataError caught: value too long for type character varying(13)"
Пример
Исключение DataError также возникает при попытке
передать некорректное значение для числового поля.
Например, при сохранении числа с плавающей точкой
в поле IntegerField:
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=50)
price = models.IntegerField() # Ожидает целое число
# Попытка сохранить продукт с дробной ценой
product = Product(
name="Laptop",
price=1299.99 # Дробное число для IntegerField
)
try:
product.save()
except DataError as e:
print("DataError caught:", e)
Результат выполнения кода:
"DataError caught: invalid input syntax for type integer: '1299.99'"
Пример
Исключение DataError может возникнуть и при выполнении
запросов на фильтрацию, если переданное значение не соответствует
типу поля. Например, при попытке отфильтровать записи по
числовому полю с передачей строкового значения:
from django.db import models
from django.db import DataError
class Employee(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
# Попытка отфильтровать сотрудников по возрасту строкой
try:
employees = Employee.objects.filter(age="thirty five")
print(employees)
except DataError as e:
print("DataError caught:", e)
Результат выполнения кода:
"DataError caught: invalid input syntax for type integer: 'thirty five'"
Пример
Исключение DataError также можно перехватывать
вместе с более общим исключением DatabaseError
для обработки любых ошибок базы данных:
from django.db import models
from django.db import DatabaseError, DataError
class Order(models.Model):
order_id = models.CharField(max_length=20)
quantity = models.IntegerField()
# Обработка ошибок данных
try:
order = Order(
order_id="ORD-12345-VERY-LONG", # Слишком длинный ID
quantity="ten" # Некорректное значение для IntegerField
)
order.save()
except DataError as e:
print("DataError caught:", e)
except DatabaseError as e:
print("DatabaseError caught:", e)
Результат выполнения кода:
"DataError caught: value too long for type character varying(20)"
Смотрите также
-
исключение
IntegrityError,
возникающее при нарушении целостности данных -
исключение
DatabaseError,
базовое исключение для всех ошибок базы данных -
исключение
FieldError,
возникающее при ошибках в именах полей модели -
исключение
ProgrammingError,
возникающее при синтаксических ошибках SQL