Python使用pymysql插入数据时SQL语句format格式化失效如何解决
问题诱因
- format方法调用位置错误:你将
.format(name2)写在了双引号包裹的SQL字符串内部,Python会将其识别为普通字符串内容,不会触发字符串格式化逻辑 - 语法逻辑漏洞:就算修正了format的位置,现有写法也没有给字符串类型的id字段值加单引号包裹,格式化后生成的SQL会被数据库误认为id值是字段名,直接抛出语法错误
- 存在安全风险:直接拼接字符串生成SQL的写法存在SQL注入漏洞,恶意构造的name2值可以直接篡改、删除数据库全表数据
解决方法
优先使用数据库驱动自带的参数化查询方案,既可以自动处理字符串转义、引号包裹逻辑,又能避免SQL注入风险:
if difficulty == 1: cursor = tetris.cursor() name2 = chr(name[0]) + chr(name[1]) + chr(name[2]) # 不同数据库的参数占位符略有差异,%s适配MySQL、PostgreSQL,?适配SQLite,可根据自己的数据库类型调整 sql = "INSERT INTO Normal (id, score) VALUES (%s, %s)" # 执行时将参数按顺序放在元组中传入第二个参数 cursor.execute(sql, (name2, 404)) tetris.commit() cursor.close()
如果仅需要修正你原有format写法的错误(不推荐生产环境使用,仅作语法参考),写法调整如下:
# format放在字符串外侧,字符串值用单引号包裹 sql = "INSERT INTO Normal (id, score) VALUES ('{}', 404)".format(name2)
内容的提问来源于stack exchange,提问作者user15716685
相关产品推荐
相关产品推荐

