sql >> Database >  >> RDS >> Mysql

Hoe het invoegen van pandas te versnellen.DataFrame .to_sql

Het probleem hier is dat voor elke rij een invoegquery wordt gemaakt, en voordat de volgende rij wordt ingevoegd, wordt gewacht op ACK.

Probeer dit fragment uit te voeren voordat u 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

Dit is een patch van nhockham op to_sql insert die regel voor regel invoegt. Dit is het github-probleem.

Als je kunt afzien van het gebruik van pandas.to_sql, raad ik je aan om sql-alchemy bulk insert te proberen of gewoon een script te schrijven om zelf een query met meerdere rijen te maken.

Bewerken:ter verduidelijking wijzigen we de _execute_insert-methode van Class SQLTable in pandas.io.sql. Dit moet dus worden toegevoegd in de scripts voordat de pandas-module wordt geïmporteerd.

De laatste regel is de wijziging.

conn.execute(self.insert_statement(), data) is gewijzigd in :

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

De eerste regel voegt rij voor rij in, terwijl de laatste regel alle rijen in één sql-instructie invoegt.

Update:voor nieuwere versies van panda's hebben we een kleine wijziging van de bovenstaande vraag nodig.

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



  1. Hoe voorwaardelijk om te gaan met delen door nul met MySQL

  2. Intervallen gespecificeerd volgens kolomwaarden in PostgreSQL

  3. PHP MySQL-query met trefwoorden/gereserveerde woorden

  4. hoeveel max join tafels op mysql? en hoe te tellen?