web-dev-qa-db-fra.com

Comment puis-je utiliser executemany pour insérer dans MySQL une liste de dictionnaires en Python

J'utilise actuellement MySQL et Python pour extraire des données du Web. Plus précisément, j'efface des données de table et les insère dans ma base de données. Ma solution actuelle fonctionne, mais je pense qu'elle est extrêmement inefficace et verrouillera très probablement ma base de données si je ne réécris pas le code. Voici ce que j'utilise actuellement (code partiel):

itemBank = []
for row in rows:
    itemBank.append((tempRow2,tempRow1,tempRow3,tempRow4)) #append data

#itemBank List of dictionaries representing data from each 
row of the table. i.e. 
('Item_Name':"Tomatoes",'Item_Price':"10",'Item_In_Stock':"10",'Item_Max':"30")

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()

L'exécution de chaque ligne du tableau est fastidieuse. J'ai essayé d'utiliser executemany, mais je n'arrive pas à comprendre comment accéder correctement aux valeurs des dictionnaires. Alors, comment puis-je utiliser executemany ici pour insérer dans la base de données compte tenu de la structure de mes données?

23
Alex Ketay
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()

J'espère que cela vous aidera

32
David.Zheng