Python使用动态列名执行mysql查询



我有python代码来更新mysql表

cur.execute("SELECT * FROM wpkv_newsletter")
count =1
for row in cur.fetchall():
list_num=count%21+1
col_name='list_'+str(list_num)

query='''UPDATE wpkv_newsletter SET %s = 1 WHERE id = %s'''

cur.execute(query,(col_name.replace(" ' " , " "),count))

count =count+1

但是我得到了这个错误

pymysql.err.编程错误:(1064,"您的SQL中有一个错误句法;查看与MySQL服务器版本相对应的手册有关在第行'list_2'=1 WHERE id=1'附近使用的正确语法1〃(

它执行的查询是

UPDATE wpkv_newsletter SET 'list_1'= 1 WHERE id = 1;

MySQL不能接受带有"引号的列名。如何在没有引号的情况下在Python 3.8中执行查询?

查询参数始终被视为字符串值。

不能将查询参数用于标识符(例如列名(。

因此,必须将列名格式化为查询字符串的固定部分,而不是动态参数。

col_name='list_'+str(list_num)
query=f'''UPDATE wpkv_newsletter SET {col_name} = 1 WHERE id = %s'''

如果变量来自不受信任的源,则会带来SQL注入的风险。但在您的情况下,列名的变量由您的代码控制,因此它是安全的。

我用这种方式实现了它

col_name='list_'+str(list_num)

query='UPDATE wpkv_newsletter SET ' +col_name +  '=1 WHERE id = %s' 

cur.execute(query,(count))

最新更新