Python:用变量更新多个列

11 投票
5 回答
36219 浏览
提问于 2025-04-15 12:41

我正在尝试写一个有效的mysql语句,这样我就可以用一些python变量的值来更新一条记录中的多个字段。

我的语句大概是这样的:

db = MySQLdb.connect(host="localhost", user="user", passwd="password", db="dbname")
cursor = db.cursor()
sql_update = "UPDATE table_name SET field1=%s, field2=%s, field3=%s, field4=%s, field5=%s, field6=%s, field7=%s, field8=%s, field9=%s, field10=%s WHERE id=%s" % (var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, id)
cursor.execute(sql_update)
cursor.close ()
db.commit()
db.close()

但是在执行这个查询的时候,我总是收到提示,说我的SQL语法有错误。我找不到具体的问题。有没有人能告诉我我的错误在哪里,或者应该怎么写呢?

5 个回答

1

我这样做的:

    def bscaSoporte(self, denom_sop):
        soporte = (denom_sop,) #Para que tome la variable, lista
        sql= 'SELECT * FROM SOPORTE_ID WHERE denom_sop LIKE ?'
        self.cursor1.execute(sql, soporte)
        return self.cursor1.fetchall()

    def updSoporte(self, lstNuevosVal):
        #busca soporte, SOLO HAY UNO que cumpla
        denom_sop = lstNuevosVal.pop(0)
        print(lstNuevosVal)
        encontrado = self.bscaSoporte(denom_sop)
        soporte = (denom_sop,) #Para que tome la variable, lista
        if encontrado != None:
            sqlupdate =('UPDATE SOPORTE_ID SET  dst_pln_eje = ?, geom_Z_eje = ?, \
            geom_Y_0_grd = ?, dst_hta_eje = ?,  geom_Z_0_grd = ?, \
            descrip = ? WHERE denom_sop  LIKE ?')
        #añado denom_soporte al final de la lista
        lstNuevosVal.append(denom_sop)
        self.cursor1.execute(sqlupdate, (lstNuevosVal))
        self.conexion.commit() 

lstNuevosVal 包含了在 sql 命令中需要替换的所有参数。lstNuevosVal 的值是

['Soporte 1', '6.35', '7.36', '8.37', '9.38', '10.39', 'Soporte 306048\nCabeza 3072589\nMáquina: Deco20\n\n']
4

请注意以下几点:

  • 你需要确认用户名和密码是正确的
  • 占位符的数量必须和你要填入的值的数量一致
  • 你使用的值的类型要和表格中对应列的类型匹配

请尝试以下代码:

db = MySQLdb.connect(host="localhost", user="user", passwd="password", db="dbname")
cursor = db.cursor()
sql_update = "UPDATE table_name SET field1=%s, field2=%s, field3=%s, field4=%s, field5=%s, field6=%s, field7=%s, field8=%s, field9=%s, field10=%s WHERE id=%s"
val =  (var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, id)
cursor.execute(sql_update, val)
db.commit()
cursor.close ()
db.close()
22

你现在使用的是字符串格式化,但其实你应该使用参数化查询。可以这样做:

cursor.execute("UPDATE table_name SET field1=%s, ..., field10=%s WHERE id=%s", (var1,... var10, id))

撰写回答