2012-03-16 4 views
0

Я создал базу данных с MySQLdb.
В базе данных у меня есть таблица с именем student с колоннами:Ошибка Mysqldb с установкой% s

 
id(is int), 
id_user(is int), 
f_name(is str), 
l_name(is str) 

Я хочу, чтобы обновить строку.
Мой код ниже:

db=mdb.connect(host="localhost", use_unicode="True", charset="utf8", 
       user="", passwd="", db="test")       
# prepare a cursor object using cursor() method 
cursor = db.cursor() 

sql="""SELECT id_user FROM student""" 

try: 
    # Execute the SQL command 
    cursor.execute(sql) 
    # Commit your changes in the database 
    db.commit() 
except: 
    # Rollback in case there is any error 
    db.rollback() 

rows = cursor.fetchall() 

the=int(7) 
se=str('ok') 
for row in rows: 
    r=int(row[0]) 
    if r==the:   
     sql2 = """UPDATE student 
       SET f_name=%s 
       WHERE id_user = %s"""% (se,the) 

       # Execute the SQL command 
     cursor.execute(sql2) 
     # Commit your changes in the database 
     db.commit() 

     db.rollback() 
# disconnect from server 
db.close() 

Когда я запускаю его я беру ошибку есть столбец с именем ОК, почему?
Может ли кто-нибудь помочь мне найти то, что я делаю неправильно, пожалуйста?

+1

Вы должны вложить строки в одинарные кавычки. –

ответ

2

Вы должны выполнить запрос, как это:

sql2 = """UPDATE student 
      SET f_name = %s 
      WHERE id_user = %s""" 
cursor.execute(sql2, (se, the)) 

Не использовать интерполяцию строки, пусть дескриптор драйвера базы данных проходящий параметры для вас. В противном случае вам придется иметь дело с синтаксическими ошибками, подобными этому, или, что еще хуже, SQL-инъекцией.

Подробнее here.

+0

+1 для ссылки. отличные вещи – bernie

+0

Спасибо, что работает !!! – TLSK

+0

Я не знаю, какой код использовать ваш или руах. Я увижу это позже :) – TLSK

3

str не завернуть его аргумент в кавычки, поэтому ваше утверждение заключается в следующем:

UPDATE student SET f_name=ok WHERE id_user = 7 

, когда это должно быть так:

UPDATE student SET f_name='ok' WHERE id_user = 7 

Таким образом, либо изменить эту строку:

   SET f_name=%s 

к этому:

   SET f_name='%s' 

либо изменить эту строку:

se=str('ok') 

к этому:

se="'" + str('ok') + "'" 

Хотя я рекомендую прочитать о SQL injection, который станет беспокойство, как только вы начнете использовать предоставленные пользователем данные вместо жестко заданных значений.

+0

+1 для подробного объяснения, хотя - как @Lukas упоминает - DB-API действительно должен использоваться здесь; как вы со ссылкой на комментарий SQL-инъекции – bernie

+0

Спасибо, что работает с вашим кодом – TLSK

0

Вы всегда должны прикладывать свои данные кавычками.

Вместо% s использовать только «% s», только вам не нужны цифровые цифры, но даже там я бы добавил% d с «% d», потому что это больше сэкономить.

Изначально вы должны использовать как минимум db.escape_string (your_data), прежде чем вставлять или обновлять те же значения в своей базе данных.

Или взглянуть на ПДО-стиле с использованием MySQLdb:

http://mysql-python.sourceforge.net/MySQLdb.html#some-examples

c=db.cursor() 
max_price=5 
c.execute("""SELECT spam, eggs, sausage FROM breakfast 
     WHERE price < %s""", (max_price,)) 
+0

Спасибо за советы !!! – TLSK

 Смежные вопросы

  • Нет связанных вопросов^_^