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

Sådan fremskyndes indsættelse fra pandas.DataFrame .to_sql

Problemet her er for hver række, der laves en insert-forespørgsel, og før næste række-insert venter den på ACK.

Prøv at køre dette uddrag før 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

Dette er en patch fra nhockham på to_sql insert som indsætter linje for linje. Her er github-problemet.

Hvis du kan undlade at bruge pandas.to_sql, foreslår jeg, at du prøver sql-alchemy bulk insert eller bare skriver et script for at lave en forespørgsel med flere rækker selv.

Edit:For at præcisere ændrer vi _execute_insert-metoden for Class SQLTable i pandas.io.sql, så dette skal tilføjes i scripts før import af pandas-modulet.

Den sidste linje er ændringen.

conn.execute(self.insert_statement(), data) er blevet ændret til :

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

Den første linje vil indsætte række for række, mens sidste linje vil indsætte alle rækker i en sql-sætning.

Opdatering:For nyere versioner af pandaer skal vi have en lille ændring af ovenstående forespørgsel.

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. Forbind MS SQL Server-databasen til Oracle 11g-databasen

  2. Oracle syntaks fejl

  3. Sådan håndteres MySQL tidszone i script

  4. 2 måder at liste alle triggere i en PostgreSQL-database