Mysqldb Ошибка обновления с установленным% s - PullRequest
0 голосов
/ 16 марта 2012

Я создал базу данных с MySQLdb.
В базе данных у меня есть таблица с именем student со столбцами:

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

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

Ответы [ 3 ]

3 голосов
/ 16 марта 2012

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-инъекции , что станет проблемой, как только вы начнете использовать предоставленные пользователем данные вместо жестко заданных значений.

2 голосов
/ 16 марта 2012

Вы должны выполнить запрос следующим образом:

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

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

Подробнее здесь .

0 голосов
/ 16 марта 2012

Вы всегда должны заключать свои данные в кавычки.

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

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

Или взгляните на стиль mysqldb, использующий pdo:

http://mysql -python.sourceforge.net / MySQLdb.html # некоторые-примеры

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