sql >> データベース >  >> RDS >> Mysql

pandas.DataFrame.to_sqlからの挿入を高速化する方法

    ここでの問題は、各行に対して挿入クエリが実行され、次の行が挿入される前にACKを待機することです。

    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
    

    これは、nhockham によるパッチです。 行ごとに挿入するto_sql挿入。 これが、githubの問題です。

    pandas.to_sqlの使用をやめることができる場合は、sql-alchemyの一括挿入を試すか、スクリプトを記述して自分で複数行のクエリを作成することをお勧めします。

    編集:明確にするために、pandas.io.sqlのクラスSQLTableの_execute_insertメソッドを変更しているため、pandasモジュールをインポートする前にこれをスクリプトに追加する必要があります。

    最後の行は変更です。

    conn.execute(self.insert_statement(), data) に変更されました:

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

    最初の行は行ごとに挿入され、最後の行はすべての行を1つのSQLステートメントに挿入します。

    更新:パンダの新しいバージョンでは、上記のクエリを少し変更する必要があります。

    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. SQLServerでCASEWHEN内の複数の列を選択するにはどうすればよいですか?

    2. ファブリックから動的にmysqlデータベースを作成する方法

    3. 更新クエリの場合MySQLPDO

    4. 無料の部屋を探す(予約システム)