2009-08-20 11 views
30

Я пытаюсь получить этот Python оператор обновления MYSQL правильно (с переменным):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) 

Любые идеи, где я неправильно?

ответ

61

Это 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)) 

Вы можете также сделать это с основной работы со строками,

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

но this way is discouraged because it leaves you open for SQL Injection. Поскольку это так просто (и аналогично) сделать это вправоtm. Сделайте это правильно.

Единственное, что вы должны быть осторожны, это то, что некоторые базы данных не поддерживают одно и то же соглашение для замены строк (на ум приходит SQLite).

+5

Ответ Паоло лучше. http://stackoverflow.com/questions/1307378/python-mysql-update-statement/1307413#1307413 – voyager

+0

Но этот будет работать с каждым бэкэндом. Эта версия не делает никаких проверок на входе, в то время как путь Паоло позволит избежать содержимого переменных. – voyager

+5

Do * не * делаю так. Вы полностью раскрываете атаки SQL-инъекций. У Пауло есть правильный ответ, потому что он гарантирует, что значения будут правильно экранированы, прежде чем передавать их в db. –

42

У вас с синтаксисом все неправильно:

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

Для более, read the documentation.

+3

+1 ты был быстрее меня :) –

+0

Это должен быть принятый ответ. –

10

Это правильный путь:

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

P.S. Не забывайте connect.commit(), или он не будет работать

+0

он работает без фиксации – emir

+0

он не работает без фиксации, я использую python 3.5 – Belter

3

Ни один из них не работал для меня по какой-то причине.

Я понял, что по какой-то причине python не читает% s. Поэтому используйте (?) Вместо% S в вашем SQL-коде.

И, наконец, это сработало для меня.

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