Python で MySQL ディクショナリ リストを効率的に挿入するためのexecutemany の利用
データ スクレイピングでは、多くの場合、テーブルから情報を抽出してデータベースに保存します。従来のアプローチは機能しますが、最適化されていないと非効率になり、データベースがクラッシュする可能性があります。
辞書のリストから MySQL データベースにデータを挿入しようとする次のコードを考えてみましょう。
itemBank = [] for row in rows: itemBank.append((tempRow2, tempRow1, tempRow3, tempRow4)) # itemBank contains dictionaries representing data from each table row for item in itemBank: tempDict1 = item[0] tempDict2 = item[1] tempDict3 = item[2] tempDict4 = item[3] q = """ INSERT IGNORE INTO TABLE1 ( Item_Name, Item_Price, Item_In_Stock, Item_Max, Observation_Date ) VALUES ( "{0}", "{1}", "{2}", "{3}", "{4}" ) """.format(tempDict1['Item_Name'], tempDict2['Item_Price'], tempDict3['Item_In_Stock'], tempDict4['Item_Max'], getTimeExtra) try: x.execute(q) conn.commit() except: conn.rollback()
ここでの問題は、itemBank の辞書ごとに個別のクエリを手動で構築して実行することにあります。このアプローチは面倒でエラーが発生しやすいです。
executemany の利用
この非効率性の解決策は、executemany メソッドを利用することです。これにより、同じクエリを複数実行できるようになります。
itemBank = [] for row in rows: itemBank.append(( tempRow2['Item_Name'], tempRow1['Item_Price'], tempRow3['Item_In_Stock'], tempRow4['Item_Max'], getTimeExtra )) #append data q = """ insert ignore into TABLE1 ( Item_Name, Item_Price, Item_In_Stock, Item_Max, Observation_Date ) values (%s,%s,%s,%s,%s) """ try: x.executemany(q, itemBank) conn.commit() except: conn.rollback()
この変更されたコードでは、行を反復処理し、辞書から値を抽出し、executemany に渡すタプルのリストを作成します。クエリ自体は同じですが、値にはプレースホルダー %s を使用するようになりました。
executemany を使用すると、すべてのデータが一度に送信されるため、効率が大幅に向上し、データベースのやり取りの数が減り、リスクが最小限に抑えられます。デッドロックの発生。
以上がexecutemany は、Python での MySQL 辞書リストの挿入をどのように最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。