Я создаю приложение Django, где пользователи будут импортировать файл Excel/CSV. Каждая строка подается через форму, как описано here (пример 3 внизу).Использование транзакций в Django при импорте файлов
Для моего импортера я сначала просматриваю весь файл, и я отображаю любые ошибки в таблице. Если ошибок нет, я покажу резюме того, что будет импортировано. Пользователь может подтвердить, и файл будет импортирован. Проблема в том, что строки зависят друг от друга для проверки (ограничения уникальности и т. Д.), Поэтому я должен сохранить каждую строку в БД для проверки правильности работы.
Я придумал подход ниже, но раньше я не использовал атомные транзакции, и я беспокоюсь о потенциальных ошибках. Я мог бы импортировать до 10 000 рядов.
Является ли код ниже штрафом за то, что я хочу достичь, или есть лучшие методы?
def import_from_csv(filename, preview):
sid = transaction.savepoint()
result = import_data(filename)
if result.has_error or preview:
transaction.savepoint_rollback(sid)
else:
transaction.savepoint_commit(sid)
return result
Дополнительная информация:
В моем приложении есть имеет два вида окрености. Первый вид - просмотр. В этом случае я вызываю import_from_csv с параметром предварительного просмотра, равным True. Таким образом, вставки всегда будут откатны. Он возвращает результаты того, что было бы импортировано. Если ошибок нет, я сохраняю местоположение файла в переменной сеанса. Если пользователь нажимает кнопку подтверждения, я снова вызываю import_from_csv, но на этот раз предварительный просмотр False. Поскольку я уже проверил файл на этапе предварительного просмотра, ошибок не должно быть и результаты будут выполнены. Я знаю, что это можно оптимизировать, так как я обрабатываю файл дважды.
Я использую Django 1.9 и Postgres (на Heroku)
Какую версию Django вы используете? Если это современная версия, вы должны использовать 'transaction.atomic', если у вас нет веской причины. –