ProgrammingError

Исключение ProgrammingError наследуется от DatabaseError и возникает в Django при выполнении некорректного SQL-запроса. Обычно это связано с синтаксическими ошибками в SQL, обращением к несуществующим таблицам или полям, а также с неправильным использованием параметров запроса.

Это исключение оборачивает соответствующее исключение драйвера базы данных и позволяет единообразно обрабатывать ошибки программирования независимо от используемой СУБД.

Синтаксис

pythonfrom django.db import ProgrammingError

try:
  # Код, который может вызвать ошибку
  pass
except ProgrammingError as e:
  # Обработка ошибки программирования
  print(f"SQL error: {e}")

Пример

Рассмотрим ошибку при обращении к несуществующему полю модели:

pythonfrom django.db import ProgrammingError
from myapp.models import Article

try:
  # Поле 'non_existent_field' не существует в модели Article
  articles = Article.objects.filter(non_existent_field='value')
  print(articles)
except ProgrammingError as e:
  print(f"Error: {e}")

Результат выполнения кода:

python"Error: column myapp_article.non_existent_field does not exist"

Пример

Ошибка также возникает при использовании неверного синтаксиса в сырых SQL-запросах:

pythonfrom django.db import connection, ProgrammingError

try:
  with connection.cursor() as cursor:
    # Некорректный SQL-запрос с ошибкой в синтаксисе
    cursor.execute("SELECT * FORM myapp_article")
    rows = cursor.fetchall()
except ProgrammingError as e:
  print(f"SQL syntax error: {e}")

Результат выполнения кода:

python"SQL syntax error: syntax error at or near \"FORM\""

Пример

Обработка ошибки при использовании неправильного имени таблицы в запросе:

pythonfrom django.db import connection, ProgrammingError

try:
  with connection.cursor() as cursor:
    # Таблица 'non_existent_table' не существует
    cursor.execute("SELECT * FROM non_existent_table")
    rows = cursor.fetchall()
except ProgrammingError as e:
  print(f"Table error: {e}")

Результат выполнения кода:

python"Table error: relation \"non_existent_table\" does not exist"

Пример

Использование транзакции для безопасного выполнения операций с возможным возникновением ProgrammingError:

pythonfrom django.db import transaction, ProgrammingError
from myapp.models import Article

try:
  with transaction.atomic():
    # Ошибочный запрос внутри транзакции
    articles = Article.objects.filter(invalid_field__contains='test')
    for article in articles:
      print(article.title)
except ProgrammingError as e:
  print(f"Transaction failed: {e}")
  # Транзакция автоматически откатится

Смотрите также

  • исключение IntegrityError,
    которое возникает при нарушении целостности данных
  • исключение OperationalError,
    которое связано с ошибками подключения к БД
  • исключение DataError,
    которое возникает при несоответствии типов данных
  • исключение FieldError,
    которое связано с ошибками в полях модели