2009-08-20 7 views
30

Je suis en train de faire cette déclaration de mise à jour de Python MYSQL correcte (avec des variables):déclaration de mise à jour Python MYSQL

cursor.execute ("UPDATE tblTableName SET Year=%s" % Year ", Month=%s" % Month ", Day=%s" % Day ", Hour=%s" % Hour ", Minute=%s" Minute "WHERE Server=%s " % ServerID) 

Toutes les idées où je vais mal?

Répondre

61

Il should be:

cursor.execute (""" 
    UPDATE tblTableName 
    SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s 
    WHERE Server=%s 
""", (Year, Month, Day, Hour, Minute, ServerID)) 

Vous pouvez également faire avec la manipulation de chaînes de base,

cursor.execute ("UPDATE tblTableName SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s WHERE Server='%s' " % (Year, Month, Day, Hour, Minute, ServerID)) 

mais this way is discouraged because it leaves you open for SQL Injection. Comme il est si facile (et similaire) de le faire le droit chemintm. Faites-le correctement. La seule chose que vous devriez faire attention, c'est que certains backends de base de données ne suivent pas la même convention pour le remplacement de chaîne (on pense à SQLite).

+5

La réponse de Paolo est meilleure. http://stackoverflow.com/questions/1307378/python-mysql-update-statement/1307413#1307413 – voyager

+0

Mais celui-ci fonctionnera avec chaque backend. Cette version ne fait aucune validation sur l'entrée, tandis que Paolo s'assurera d'échapper au contenu des variables. – voyager

+5

Ne * pas * le faire de cette façon. Vous vous laissez largement ouvert aux attaques par injection SQL. Paulo a la bonne réponse, car il s'assure que les valeurs sont correctement échappées avant de les passer à la base de données. –

42

Vous avez la syntaxe tout faux:

cursor.execute (""" 
    UPDATE tblTableName 
    SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s 
    WHERE Server=%s 
""", (Year, Month, Day, Hour, Minute, ServerID)) 

Pour plus, read the documentation.

+3

+1 vous étiez plus rapide que moi :) –

+0

cela devrait être la réponse acceptée. –

10

Ceci est la bonne façon:

import MySQLdb 

if __name__ == '__main__': 
    connect = MySQLdb.connect(host="localhost", port=3306, 
           user="xxx", passwd="xxx", db='xxx', charset='utf8') 

    cursor = connect.cursor() 

    cursor.execute(""" 
     UPDATE tblTableName 
     SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s 
     WHERE Server=%s 
    """, (Year, Month, Day, Hour, Minute, ServerID)) 

    connect.commit() 
    connect.close() 

post-scriptum Ne pas oublier connect.commit(), ou cela ne fonctionnera pas

+0

cela fonctionne sans commettre – emir

+0

cela ne fonctionne pas sans commit, j'utilise python 3.5 – Belter

3

Aucun d'entre eux ont travaillé pour moi pour une raison quelconque.

J'ai compris que pour une raison quelconque, python ne lit pas% s. Donc, utilisez (?) Au lieu de% S dans votre code SQL.

Et finalement cela a fonctionné pour moi.

cursor.execute ("update tablename set columnName = (?) where ID = (?) ",("test4","4")) 
    cursor.commit()