MySQL-Python中SQL拼接的+号、引号含义及无+号替代方案咨询
问题解答
参考代码
mycursor.execute("insert into patients values('"+str(patient)+"','"+name+"','"+age+"','"+gender+"','"+date+"')")
1、代码中+号的作用是什么?
这里的+是Python的字符串拼接运算符,作用是将固定SQL片段、各个变量转换后的字符串、SQL要求的字符串值边界符按顺序拼接,最终得到一个完整可执行的INSERT语句。
2、代码中同时使用单引号和双引号的原因是什么?
主要是兼顾Python字符串语法和SQL语法的要求:
- Python允许用单引号或双引号包裹字符串,外层用双引号的情况下,字符串内部的单引号不需要额外转义,写起来更方便
- SQL语法规定,插入的字符串类型字段值必须用单引号包裹,所以内部的单引号是给SQL引擎识别用的,用来标记各个变量对应的值的边界。
如果不用双引号套单引号的写法,就需要对内部的单引号做转义,比如写成"insert into patients values(\'"+str(patient)+...",可读性会大幅下降。
3、是否存在无需使用+号的等效实现方案?
存在,而且更推荐不用+拼接的方案,尤其是参数化查询的写法,还能规避原写法的SQL注入风险:
- 方案1:字符串格式化(仅实现不用
+的效果,仍存在SQL注入风险,不推荐用于生产环境)
以Python3.6+支持的f-string为例:sql = f"insert into patients values('{str(patient)}','{name}','{age}','{gender}','{date}')" mycursor.execute(sql) - 方案2:参数化查询(最佳实践)
这是数据库操作的标准写法,既不需要手动拼接字符串,也不需要手动加单引号,还能完全避免SQL注入漏洞:
这种写法将SQL语句和参数分开传给execute方法,由数据库驱动自动处理参数的转义、类型匹配和边界包裹,安全性和可读性都远高于原写法。# 占位符根据你使用的数据库驱动可能有区别,比如MySQL用%s,SQLite用?,逻辑完全一致 mycursor.execute("insert into patients values(%s,%s,%s,%s,%s)", (str(patient), name, age, gender, date))
内容的提问来源于stack exchange,提问作者VeeAm
相关产品推荐
相关产品推荐

