Mysql
 sql >> Database >  >> RDS >> Mysql

Come velocizzare l'inserimento da pandas.DataFrame .to_sql

Il problema qui è che per ogni riga viene eseguita una query di inserimento, quindi prima dell'inserimento della riga successiva attende ACK.

Prova a eseguire questo snippet prima di 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

Questa è una patch di nhockham su to_sql inserto che inserisce riga per riga. Ecco il problema con github.

Se puoi rinunciare a usare pandas.to_sql, ti suggerisco di provare l'inserimento in blocco di sql-alchemy o semplicemente di scrivere uno script per creare una query multiriga da solo.

Modifica:per chiarire, stiamo modificando il metodo _execute_insert di Class SQLTable in pandas.io.sqlQuindi questo deve essere aggiunto negli script prima di importare il modulo Pandas.

L'ultima riga è il cambiamento.

conn.execute(self.insert_statement(), data) è stato modificato in :

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

La prima riga inserirà riga per riga mentre l'ultima riga inserirà tutte le righe in un'unica istruzione sql.

Aggiornamento:per le versioni più recenti di Panda, avremo bisogno di una leggera modifica della query precedente.

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