繁体   English   中英

Python MYSQL 动态变量错误与 SQL 语法

[英]Python MYSQL dynamic variables error with SQL syntax

我在下面写了 function:

def update_record(col, new_value, date, finance_manager_table, connection):
    finance_manager_table.execute("""
       UPDATE financemanager
       SET %s = %s
       WHERE Date = %s
    """, (col, new_value, date))
    connection.commit()

然后我尝试使用以下命令调用 function: dbc.update_record("Salary", "2500", "January/22", finance_manager_table, connection)然后遇到错误:

mysql.connector.errors.ProgrammingError: 1064 (42000): 你的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“薪水”= 2500 WHERE Date = 'January/22'' 附近使用正确的语法

所以看起来它创建了正确的陈述,但仍然是错误的。

我已经删除了“col”,而是写了“SET Salary = %s”,这很有效。

写“SET %s = %s”是不对的,还是有其他问题?

谢谢! 亚当

您需要对数据库 object 名称(表、列等)使用 Python 的字符串格式化方法之一(f-string、.format),将它们包装在反引号中并使用%s替换 the.execute( ) 防止 SQL 注入的值的方法:

def update_record(col, new_value, date, finance_manager_table, connection):
    finance_manager_table.execute(f"""
       UPDATE financemanager
       SET `{col}` = %s
       WHERE Date = %s
    """, (new_value, date))
    connection.commit()

或者

def update_record(col, new_value, date, finance_manager_table, connection):
    finance_manager_table.execute("""
       UPDATE financemanager
       SET `{}` = %s
       WHERE Date = %s
    """.format(col), (new_value, date))
    connection.commit()

使用 Python 3 的 f-Strings:改进的字符串格式化语法

s = f"""
       UPDATE financemanager
       SET {col} = {new_value}
       WHERE Date = '{date}'
    """
finance_manager_table.execute(s)

我认为您收到错误的原因是因为在您的查询部分SET %s = %s中,您传入的第一个变量被解释为字符串,因此它用单引号括起来。 这导致它不能被识别为列名。 换句话说,它将查询的那部分转换为SET 'Salary' = 2500

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM