如何在 psycopg2 中更新 table

How to UPDATE table in psycopg2

def GetUpdate():
    enter = input("What attributes do you want to change ? ")
    select,p_id =  input("Please enter your attributes separated by space: ").split()
    try:
        cur.execute("UPDATE  Diary SET %s = %s where diary_id = %s",(enter,select,p_id))
        #cur.execute(sql, (select, p_id))
        con.commit()
        print("Updating in table Diary is completed successfully")
    except (Exception, ps.DatabaseError) as error:
        print(error)

我想创建更新功能,如您所见,我有 3 个输入参数,第一个是我要更改的数据库中的哪一列。但是 2,3 参数是更新参数。当我尝试 运行 这段代码时,我遇到了错误。他不是将我的第一个输入作为参数,而是作为 Variable(string)

cur.execute("UPDATE  Diary SET ❌%s❌ = %s where diary_id = %s",(enter,select,p_id))

您不能使用绑定变量来设置表名或列名等。 IE。您不能 compose/build 来自绑定的查询,只能使用绑定来替换 sql 参数。

例如,参见 Oracle doc(我找到的第一个引用此内容的人):

Bind variables can be used to substitute data, but cannot be used to substitute the text of the statement. You cannot, for example, use a bind variable where a column name or a table name is required. Bind variables also cannot be used in Data Definition Language (DDL) statements, such as CREATE TABLE or ALTER statements.

当然,您可以将查询编写为

qry = f"UPDATE  Diary SET {enter} = %s ..."
cur.execute(qry,(select,p_id))

但这是 sql injection kind 的巨大安全风险,并且围绕如何安全地接受用户提供的参数以构建安全的 sql 查询进行设计超出了回答您询问为什么出现此错误的问题正在发生。