Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara mempercepat penyisipan dari pandas.DataFrame .to_sql

Masalahnya di sini adalah untuk setiap baris kueri penyisipan dibuat, lalu sebelum penyisipan baris berikutnya menunggu ACK.

Coba jalankan cuplikan ini sebelum 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

Ini adalah tambalan oleh nhockham pada to_sql insert yang menyisipkan baris demi baris. Inilah masalah github.

Jika Anda tidak dapat menggunakan pandas.to_sql, saya sarankan Anda mencoba menyisipkan massal sql-alchemy atau hanya menulis skrip untuk membuat kueri multibaris sendiri.

Sunting:Untuk memperjelas, kami memodifikasi metode _execute_insert dari Class SQLTable di pandas.io.sqlJadi ini harus ditambahkan dalam skrip sebelum mengimpor modul pandas.

Baris terakhir adalah perubahan.

conn.execute(self.insert_statement(), data) telah diubah menjadi :

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

Baris pertama akan menyisipkan baris demi baris sedangkan baris terakhir akan menyisipkan semua baris dalam satu pernyataan sql.

Pembaruan:Untuk versi panda yang lebih baru, kami memerlukan sedikit modifikasi dari kueri di atas.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysqlimport dari pipa

  2. Kesalahan:sambungkan ECONNREFUSED saat mengakses mysql

  3. Bagaimana cara membuat kunci utama mulai dari 1000?

  4. Mengapa loop foreach saya tidak berfungsi seperti yang diharapkan?

  5. mysql dapatkan baris terbaru dari nilai kolom paling umum