sql >> Databáze >  >> RDS >> Mysql

Jak urychlit vkládání z pandas.DataFrame .to_sql

Problém je v tom, že pro každý řádek je vytvořen dotaz na vložení, pak před vložením dalšího řádku čeká na ACK.

Zkuste tento úryvek spustit před 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

Toto je oprava od nhockham na to_sql insert, který vkládá řádek po řádku. Zde je problém s githubem.

Pokud se můžete vzdát používání pandas.to_sql, doporučuji vám zkusit hromadné vkládání sql-alchemy nebo napsat skript, abyste sami vytvořili víceřádkový dotaz.

Edit:Abychom objasnili, upravujeme metodu _execute_insert třídy SQLTable v pandas.io.sqlTakže to musí být přidáno do skriptů před importem modulu pandas.

Poslední řádek je změna.

conn.execute(self.insert_statement(), data) byl změněn na :

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

První řádek vloží řádek po řádku, zatímco poslední řádek vloží všechny řádky do jednoho příkazu SQL.

Aktualizace:Pro novější verze pand budeme potřebovat mírnou úpravu výše uvedeného dotazu.

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. Předání hodnoty z rozevíracího seznamu nebo textového pole ve Wordpressu do dotazu MySQL ve functions.php

  2. Pomalý poddotaz v MySQL

  3. Vyhledávací dotaz necitlivý na důraz v MySQL

  4. Oprávnění pro vytvoření spouštěče v mysql