Maison > Article > base de données > Comment performmany peut-il optimiser l'insertion MySQL de listes de dictionnaires en Python ?
Utilisation d'executemany pour une insertion MySQL efficace de listes de dictionnaires en Python
Le grattage de données implique souvent l'extraction d'informations à partir de tables et leur stockage dans une base de données. Bien que l'approche conventionnelle fonctionne, elle peut devenir inefficace et potentiellement faire planter la base de données si elle n'est pas optimisée.
Considérez le code suivant qui tente d'insérer des données d'une liste de dictionnaires dans une base de données 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()
Le problème ici réside dans la construction et l'exécution manuelles de requêtes individuelles pour chaque dictionnaire dans itemBank. Cette approche est lourde et sujette aux erreurs.
Tirer parti de l'exécution
La solution à cette inefficacité consiste à utiliser la méthode exécutermany, qui vous permet d'exécuter la même requête plusieurs fois. fois en utilisant une liste de paramètres.
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()
Dans ce code modifié, nous parcourons les lignes, extrayons les valeurs des dictionnaires et créons une liste de tuples à transmettre à l'exécution. La requête elle-même reste la même, mais nous utilisons désormais les espaces réservés %s pour les valeurs.
L'utilisation d'executemany améliore considérablement l'efficacité, car elle envoie toutes les données en une seule fois, réduisant ainsi le nombre d'interactions avec la base de données et minimisant les risques. des impasses.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!