2017-02-19 7 views
1

Je suis en train d'exécuter cette requête de mise à jour des colonnes dans une trame de données de pandas géants:comment mettre à jour plusieurs lignes en ms accès de pandas géants dataframe

sql = "UPDATE tblhis_ventas SET portabilidad = '%s' WHERE (contrato = '%s' and estado = '%s') " % (
    df['portabilidad'], df['contrato'], df['estado'] 
) 

cursor.execute(sql) 

La requête n'est pas exécutée et aucune erreur ne s'affiche.

Mon dataframe ressemble ci-dessous:

Data Table Screeshot

Répondre

1

Malheureusement, MS Access (en particulier son Jet-niveau du disque/ACE moteur non le programme GUI .exe) n'est pas supporté par SQLAlchemy pour permettre la méthode pandas.to_sql() qui idéalement vous pouvez pousser votre dataframe à une table temporaire dans la base de données pour exécuter une requête UPDATE final INNER JOIN temp ... pour mettre à jour la table finale, une déroute beaucoup plus rapide e que d'itérer entre les lignes.

Heureusement, le moteur Jet/ACE de MS Access peut interroger les fichiers csv comme s'il s'agissait de tables où vous spécifiez le chemin du fichier, puis le nom du fichier csv. Par conséquent, envisagez d'exporter l'infrastructure de données to_csv, puis créez une table temporaire à l'aide de la requête Make-Table et exécutez enfin la requête de jointure de mise à jour. Au-dessous de try/except est utilisé pour supprimer la table si elle existe (puisque la commande IF EXISTS n'est pas disponible dans MS Access SQL).

df.to_csv('C:\Path\To\CSV\Output.csv', index=False) 

try: 
    cursor.execute("SELECT * INTO tblhis_ventas_Temp" +\ 
        " FROM [text;HDR=Yes;FMT=Delimited(,);Database=C:\Path\To\CSV].Output.csv") 
    conn.commit() 

    cursor.execute("UPDATE tblhis_ventas f INNER JOIN tblhis_ventas_Temp t" + \ 
        " ON f.contrato = t.contrato AND f.estado = t.estado" + \ 
        " SET f. portabilidad = t.portabilidad") 
    conn.commit() 

except Exception as e:  
    if 'already exists' in str(e): 
     cursor.execute("DROP TABLE tblhis_ventas_Temp") 
     conn.commit() 
    else: 
     print(e) 

cursor.close() 
conn.close() 

Et non, nous ne pouvons pas utiliser directement le fichier CSV dans UPDATE requête (sans passer par des processus de table temporaire) comme csv est en lecture seule et non actualisable recordset. Fait intéressant, vous pouvez utiliser CSV dans un INSERT...SELECT.

+0

ça marche! C'est très rapide. Je ne connaissais pas les fichiers csv temporaires en accès ms. Je vous suis très reconnaissant à tous. – calobeto

0

lignes ITERATE et mettre à jour un par un:

sql = 'UPDATE tblhis_ventas SET portabilidad = ? WHERE contrato = ? and estado = ?' 
for index, row in df.iterrows(): 
    cursor.execute(sql, [row['portabilidad'], row['contrato'], row['estado']]) 
+0

cela fonctionne !. Le problème est que la table est plus de 10k et il faut plus de 10 minutes pour mettre à jour un champ, j'ai besoin de 10 champs de plus;). Y a-t-il un moyen rapide? – calobeto

+0

@calobeto, Pourriez-vous montrer tout le code? Sans savoir quelles données sont sélectionnées, et quelles opérations sont faites avec 'df', je ne peux pas vous dire comment l'améliorer, ou même vous dire si c'est possible. – falsetru