Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách tăng tốc độ chèn từ gấu trúc.DataFrame .to_sql

Vấn đề ở đây là đối với mỗi hàng một truy vấn chèn được thực hiện, sau đó trước khi chèn hàng tiếp theo, nó sẽ đợi ACK.

Thử chạy đoạn mã này trước khi 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

Đây là bản vá của nhockham trên to_sql insert sẽ chèn từng dòng. Đây là sự cố github.

Nếu bạn có thể từ bỏ việc sử dụng pandas.to_sql, tôi khuyên bạn nên thử chèn hàng loạt sql-alchemy hoặc chỉ cần viết tập lệnh để tự tạo một truy vấn nhiều con.

Chỉnh sửa:Để làm rõ, chúng tôi đang sửa đổi phương thức _execute_insert của Lớp SQLTable trong pandas.io.sql Vì vậy, điều này phải được thêm vào tập lệnh trước khi nhập mô-đun gấu trúc.

Dòng cuối cùng là sự thay đổi.

conn.execute(self.insert_statement(), data) đã được đổi thành:

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

Dòng đầu tiên sẽ chèn từng hàng trong khi dòng cuối cùng sẽ chèn tất cả các hàng trong một câu lệnh sql.

Cập nhật:Đối với các phiên bản gấu trúc mới hơn, chúng tôi sẽ cần sửa đổi một chút đối với truy vấn trên.

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. Đảm bảo kết nối MySQL hoạt động trong hàm PHP

  2. Tôi có nên chạy mysql trên google cloud run không? (hoặc bất kỳ cơ sở dữ liệu nào)

  3. Truy vấn SQL dường như không hoạt động

  4. sự cố khi cài đặt gem mysql2 với rails3 trên mac

  5. ReplicationManager đã đưa ra một ngoại lệ khi mở một kết nối