MySQL 和 Python:并非所有参数都在 SQL 语句中使用

Posted

技术标签:

【中文标题】MySQL 和 Python:并非所有参数都在 SQL 语句中使用【英文标题】:MySQL & Python: Not all parameters were used in the SQL statement 【发布时间】:2020-12-12 04:59:06 【问题描述】:

我使用 mysql 创建了以下数据库:

CREATE TABLE tutors (
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(320) NOT NULL,
description VARCHAR(400) NOT NULL,
image VARCHAR(150) NOT NULL, 
applyDate DATE NOT NULL)

图像列存储我存储在文件系统中的图像的绝对路径。

但是,当我尝试插入用户输入的数据时,例如

arguments = ("Name", "a@gmail.com", "desc", "C:\\Users\\path\\to\\image.png", "2020-08-23")

在代码中使用 Python

cursor.execute("INSERT INTO tutors (name, email, description, image, applyDate) VALUES (?, ?, ?, ?, ?)", arguments)
conn.commit()

它给了我以下错误:

mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement.

当我将每个? 替换为%s 时它会起作用,但我已经读到%s 容易受到SQL 注入攻击,所以我宁愿尽可能远离它。 ? 不起作用是有原因的吗?

【问题讨论】:

你读错了。对于带有 mysql.connector 的预处理语句,%s 是占位符,而不是 ?。当 %s 不用作预准备语句的占位符,而是用于文本替换时,如 cursor.execute("SELECT y from t where x = '%s'" % some_value) 而不是 cursor.execute("SELECT y from t where x = %s", (some_value,)),则 %s 会受到 SQL 注入的影响 【参考方案1】:

? 占位符仅适用于准备好的语句游标,例如 cursor = conn.cursor(prepared=True)

如果您不想或不需要使用准备好的语句,请使用%s 作为占位符。这是安全的,因为它们的值在执行查询之前被转义和引用。

【讨论】:

以上是关于MySQL 和 Python:并非所有参数都在 SQL 语句中使用的主要内容,如果未能解决你的问题,请参考以下文章

带有熊猫数据框输入的 sklearn 分类报告产生:“TypeError:并非所有参数都在字符串格式化期间转换”

TypeError:在字符串格式化python Flask期间并非所有参数都转换了[重复]

BayesSearchCV 跳过:ValueError:并非所有点都在空间范围内

Python 错误:TypeError:字符串格式化期间并非所有参数都转换

并非所有 graphql 查询数据都在 GatsbyJS 页面上呈现

TypeError:在字符串格式化python期间并非所有参数都转换了