sql >> Databasteknik >  >> RDS >> Mysql

Hur man snabbar på insättning från pandas.DataFrame .to_sql

Problemet här är att för varje rad en infogningsfråga görs, innan nästa rad infogning väntar den på ACK.

Testa att köra det här utdraget innan du 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

Det här är en patch av nhockham på to_sql insert som infogar rad för rad. Här är github-problemet.

Om du kan avstå från att använda pandas.to_sql föreslår jag att du provar sql-alchemy bulk insert eller bara skriver ett skript för att göra en flerradsfråga själv.

Edit:För att förtydliga ändrar vi _execute_insert-metoden för klass SQLTable i pandas.io.sql, så detta måste läggas till i skripten innan du importerar pandasmodulen.

Den sista raden är förändringen.

conn.execute(self.insert_statement(), data) har ändrats till :

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

Den första raden infogar rad för rad medan den sista raden infogar alla rader i en sql-sats.

Uppdatering:För nyare versioner av pandor kommer vi att behöva en liten modifiering av ovanstående fråga.

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. Rails mysql ELF-huvudfel

  2. Hur kontrollerar man om alla fält är unika i Oracle?

  3. sök i databasen baserat på värdet som valts från databasen

  4. Hur man går igenom datagridview 1 och kopierar loopresultat till datagridview2 i en annan form och DB-tabell