我用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,为什么? 任何人都可以帮我找到我做错了吗?
答案 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,))