You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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注入漏洞:
    # 占位符根据你使用的数据库驱动可能有区别,比如MySQL用%s,SQLite用?,逻辑完全一致
    mycursor.execute("insert into patients values(%s,%s,%s,%s,%s)", (str(patient), name, age, gender, date))
    
    这种写法将SQL语句和参数分开传给execute方法,由数据库驱动自动处理参数的转义、类型匹配和边界包裹,安全性和可读性都远高于原写法。

内容的提问来源于stack exchange,提问作者VeeAm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 00:36:04