如何在 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 查询进行设计超出了回答您询问为什么出现此错误的问题正在发生。
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 查询进行设计超出了回答您询问为什么出现此错误的问题正在发生。