如何使用 Python 在 UPDATE 语句 sqlite3 中插入​​变量?

Ana*_*sef 2 python sqlite

如果我想使用 python 在 sqlite3 中插入​​一个变量值,请编写以下语句。例如:

import sqlite3
import random

conn = sqlite3.connect('testing.db')
c = conn.cursor()
c.execute("CREATE TABLE IF NOT EXISTS testing(Name TEXT, Telephone TEXT, ID REAL)")

var1 = input("Value:")
var2 = input("Value:")
var3 = random.randint(1,20)

c.execute("INSERT INTO testing VALUES(?, ?, ?)", (var1, var2, var3))

conn.commit()
conn.close()
Run Code Online (Sandbox Code Playgroud)

如果我想对UPDATE语句做同样的事情怎么办。我试过这个并给我错误:

column = input("Column to update:")
update_user = input("Value to update:")
field_name = input("Where field name equal to:")
value = input("Value")

c.execute("UPDATE testing SET ? = ? WHERE ? = ?", (column, update_user, field_name, value))

conn.commit()
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

sqlite3.OperationalError: near "?": syntax error
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 5

这实际上是一个常见问题,在您的更新查询中,您无法参数化列名。换句话说:

UPDATE testing SET ? = ? WHERE ? = ?
               THIS^       THIS^
Run Code Online (Sandbox Code Playgroud)

不能是查询占位符,您必须以通常的方式插入它们 - 通过字符串格式:

c.execute("""
    UPDATE 
        testing 
    SET 
        {0} = ? 
    WHERE 
        {1} = ?""".format(column, field_name), (update_user, value))
Run Code Online (Sandbox Code Playgroud)

但是,您应该注意正确清理、验证columnfield_name值以防止SQL 注入攻击