MySQL&;Python:SQL语句中没有使用所有参数

MySQL&;Python:SQL语句中没有使用所有参数,python,sql,python-3.x,mysql-connector,mysql-connector-python,Python,Sql,Python 3.x,Mysql Connector,Mysql Connector Python,我使用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) 其中“图像”列存储我存储在文件

我使用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注入攻击,因此如果可能,我宁愿远离它。是否有原因
不起作用?

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


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

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


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

您读错了。对于使用mysql.connector准备的语句,%s是占位符,而不是?%当s没有用作已准备语句的占位符,而是用于文本替换时,它将接受SQL注入,如
cursor.execute(“从t中选择y,其中x='%s'%some\u值”)
而不是
cursor.execute(“从t中选择y,其中x=%s”,(some\u值),)
您读错了。对于使用mysql.connector准备的语句,%s是占位符,而不是?%当s不是用作准备语句的占位符,而是用于文本替换时,它会受到SQL注入的影响,如
cursor.execute(“从t中选择y,其中x='%s'%some\u值”)
而不是
cursor.execute(“从t中选择y,其中x=%s”,(some\u值),)