Пожалуйста, несите меня, когда я объясняю проблему, как я пытался ее решить, и мой вопрос о том, как его улучшить, в конце.
У меня есть 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
Это было быстрее, чем не-threaded read/persist, но это медленнее, чем массовая загрузка файла в базу данных. Завершение работы закончилось после примерно 45 минут. Для удовольствия я решил написать его в SQL операторам потребовалось 5 минут.
Написание инструкций SQL заняло у меня пару часов. Так что мой вопрос в том, мог ли я использовать более быстрый метод для вставки строк, используя SQLAlchemy? Насколько я понимаю, SQLAlchemy не предназначен для массовых вставки, поэтому это меньше, чем идеально.
Это следует моему вопросу, есть ли способ генерировать SQL-выражения, используя SQLAlchemy, throw их в файл, а затем просто использовать массовую загрузку в базу данных? я знаете о str (model_object), но он не показывает интерполированный значения.
Буду признателен за то, как это сделать быстрее.
Спасибо!