sql >> Base de Datos >  >> RDS >> Mysql

Cómo acelerar la inserción desde pandas.DataFrame .to_sql

El problema aquí es que para cada fila se realiza una consulta de inserción, luego, antes de insertar la siguiente fila, espera ACK.

Intente ejecutar este fragmento antes de 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

Este es un parche de nhockham en to_sql insert que inserta línea por línea. Este es el problema de github.

Si puede renunciar a usar pandas.to_sql, le sugiero que pruebe la inserción masiva de sql-alchemy o simplemente escriba un script para hacer una consulta de varias filas usted mismo.

Editar:para aclarar, estamos modificando el método _execute_insert de Class SQLTable en pandas.io.sql, por lo que debe agregarse en los scripts antes de importar el módulo pandas.

La última línea es el cambio.

conn.execute(self.insert_statement(), data) ha sido cambiado a :

conn.execute(self.insert_statement().values(data))

La primera línea insertará fila por fila mientras que la última línea insertará todas las filas en una instrucción sql.

Actualización:para las versiones más nuevas de pandas, necesitaremos una ligera modificación de la consulta anterior.

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