mysql-python中的+<str_name>+是什么意思?

What does +<str_name> + in mysql-python signify?

考虑代码:

mycursor.execute("insert into patients values('"+str(patient)+"','"+name+"','"+age+"','"+gender+"','"+date+"')")

--其中患者、姓名、年龄、性别、日期是变量

我有 3 个问题:

这里有两个+是什么? 为什么这里有两个引号(单引号和双引号)?

此代码是否有任何替代方案(不使用 +)?

您代码中的 + 与 MySQL 无关。它用于将 Python 个字符串连接在一起。您需要两个引号,因为一个(单引号)用于分隔 SQL 字符串,另一个(双引号)用于分隔 Python 字符串。

>>> name = "john"
>>> age = 55
>>> "insert into people values ('"+name+"', '"+str(age)+"')"
"insert into people values ('john', '55')"

但是,您永远不应该对 SQL 查询使用字符串连接。它使您容易受到所谓的 SQL 注入攻击,您可以在其中操纵查询,例如,使其删除条目而不是插入条目。

>>> name = "'); drop table people; --"
>>> age = ""
>>> "insert into people values ('"+name+"', '"+str(age)+"')"
"insert into people values (''); drop table people; --', '')"

(obligatory XKCD)

相反,您应该使用数据库驱动程序库提供的语法在查询中安全地插入值。在 Python 中,您的代码可以重写为:

mycursor.execute("insert into patients values(%s, %s, %s, %s, %s)", (str(patient), name, age, gender, date))