Как остановить "скрытое" исключение выполнения курсора Python Django с помощью SQLite
Я пытаюсь автоматизировать полную перестройку схемы приложения в Django. В основном, удалить все старые таблицы, удалить файл(ы) миграции и кэш, удалить историю миграции, а затем makemigrations и мигрировать. Я понимаю, что это заставит некоторых почесать голову, но мне нравится управлять конфигурацией моих тестовых данных и загружать то, что мне нужно из файлов csv, и "начинать с нуля" намного проще с этой моделью.
Я надеюсь, что автоматизация будет работать со всеми различными базами данных, поддерживаемыми Django, поэтому пытаюсь придумать общий подход (хотя некоторые пробелы и перебор).
Как отмечалось выше, первым шагом будет удаление всех существующих таблиц. Исходя из предположения, что большинство изменений моделей не являются удалениями, я делаю некоторую интроспекцию класса, чтобы определить все модели, а затем пытаюсь определить, существуют ли связанные таблицы:
app_models = get_all_app_models(models.Model, app_label)
# Loop through and remove models that no longer exist by doing a count, which should
# work no matter the SQL DBMS.
with connection.cursor() as cursor:
for app_model in app_models[:]:
try:
cursor.execute (f'select count (*) from {app_model._meta.db_table}')
except OperationalError:
app_models.remove(app_model)
<lots more code, doing cursor and other stuff that works OK>
После завершения вышеописанных действий, app_models содержит таблицы, которые остались, и код затем работает над их удалением (что само по себе нетривиально в общем случае).
Обработка содержится в представлении/форме Django и после завершения она пытается вывести простую страницу "okey dokey". Проблема в том, что во время рендеринга возникает исключение, говорящее "нет такой таблицы: xxx", и это относится к оператору execute. Не отображается никакой другой контекст стека вызовов.
На упомянутую таблицу действительно ссылались в execute, фактически она была последней в исходной app_models. Почему-то кажется, что Django сохраняет информацию об ошибке после закрытия курсора (очистка 'with') и каким-то образом исполняет ее во время обработки рендеринга. Я попытался выполнить "хороший" SQL-запрос, чтобы "очистить" ошибку, но безуспешно. Я попытался "удалить" курсор, также безуспешно.