设置%s的Mysqldb更新错误

时间:2012-03-16 18:46:21

标签: python mysql mysql-python

我用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 个答案:

答案 0 :(得分: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,但一旦开始使用用户提供的数据而不是硬编码值,这将成为一个问题。

答案 1 :(得分:2)

您应该像这样运行查询:

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

不要使用字符串插值,让数据库驱动程序处理为您传递参数。否则你必须处理这样的语法错误,或者更糟糕的是,SQL注入。

更多详情here

答案 2 :(得分:0)

您应该始终用引号括起数据。

而不是%s只使用'%s',你不需要它的唯一类型是数字类型,但即使在那里我会用'%d'括起%d,因为它更省钱。

在将相同的值插入或更新到数据库之前,至少应该使用db.escape_string(your_data)。

或者看一下mysqldb的pdo-using风格:

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