Пожалуйста, потерпите меня, пока я объясняю проблему, как я пытался ее решить,
и мой вопрос о том, как его улучшить, в конце.
У меня есть 100 000 строк CSV-файла из автономного пакетного задания, и мне нужно было
вставьте его в базу данных как соответствующие модели. Обычно, если это довольно прямолинейная загрузка, ее можно легко загрузить, просто подключив файл CSV для соответствия схеме; но мне пришлось выполнить некоторую внешнюю обработку, требующую запросов, и гораздо удобнее использовать SQLAlchemy для генерации нужных мне данных.
Данные, которые я хочу здесь, представляют собой 3 модели, которые представляют 3 предварительные таблицы
в базе данных и каждая последующая модель зависит от предыдущей модели.
Например:
Model C --> Foreign Key --> Model B --> Foreign Key --> Model A
Итак, модели должны быть вставлены в порядке A, B и C. Я придумал
с подходом производителя / потребителя:
- instantiate a multiprocessing.Process which contains a
threadpool of 50 persister threads that have a threadlocal
connection to a database
- read a line from the file using the csv DictReader
- enqueue the dictionary to the process, where each thread creates
the appropriate models by querying the right values and each
thread persists the models in the appropriate order
Это было быстрее, чем многопоточное чтение / сохранение, но это намного медленнее, чем
массовая загрузка файла в базу данных. Работа закончена сохраняющейся
примерно через 45 минут . Ради интереса я решил написать это на SQL
Заявления заняли 5 минут .
Написание операторов SQL заняло у меня пару часов. Так что мой
вопрос, мог бы я использовать более быстрый метод для вставки строк с помощью
SQLAlchemy? Насколько я понимаю, SQLAlchemy не предназначен для массовых
операции вставки, так что это не идеально.
Это следует из моего вопроса, есть ли способ генерировать операторы SQL с использованием SQLAlchemy, throw
их в файл, а затем просто использовать массовую загрузку в базу данных? я
знать о str (model_object), но он не показывает интерполированный
значения.
Буду признателен за любые рекомендации, как сделать это быстрее.
Спасибо!