Проблема здесь в том, что для каждой строки выполняется запрос на вставку, затем перед вставкой следующей строки он ожидает подтверждения.
Попробуйте запустить этот фрагмент до import pandas as pd
from pandas.io.sql import SQLTable
def _execute_insert(self, conn, keys, data_iter):
print("Using monkey-patched _execute_insert")
data = [dict((k, v) for k, v in zip(keys, row)) for row in data_iter]
conn.execute(self.insert_statement().values(data))
SQLTable._execute_insert = _execute_insert
Это патч nhockham для вставки to_sql, который вставляет построчно. Вот проблема github.
Если вы можете отказаться от использования pandas.to_sql, я предлагаю вам попробовать массовую вставку sql-alchemy или просто написать скрипт, чтобы сделать многострочный запрос самостоятельно.
Редактировать: Чтобы уточнить, мы модифицируем метод _execute_insert класса SQLTable в pandas.io.sql, поэтому его нужно добавить в сценарии перед импортом модуля pandas.
Последняя строка - это изменение.
conn.execute(self.insert_statement(), data)
был изменен на:
conn.execute(self.insert_statement().values(data))
Первая строка будет вставлять строку за строкой, а последняя строка будет вставлять все строки в одном выражении sql.
Обновление: для более новых версий панд нам потребуется небольшая модификация вышеуказанного запроса.
from pandas.io.sql import SQLTable
def _execute_insert(self, conn, keys, data_iter):
print("Using monkey-patched _execute_insert")
data = [dict(zip(keys, row)) for row in data_iter]
conn.execute(self.table.insert().values(data))
SQLTable._execute_insert = _execute_insert