python使用插入带有%的字符串到mysql数据库

举报
彭世瑜 发表于 2021/08/13 23:52:45 2021/08/13
【摘要】 使用Navicat插入 新建包含两个字段,分别是id(自增主键),name(姓名)的数据表 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` `varchar`(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB...

使用Navicat插入

新建包含两个字段,分别是id(自增主键),name(姓名)的数据表

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` `varchar`(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  
 
  • 1
  • 2
  • 3
  • 4
  • 5

在Navicat中使用原生sql直接插入100%

insert into student(name) VALUES ('100%')
  
 
  • 1

返回

Affected rows: 1, Time: 0.001000s
  
 
  • 1

数据库查看,确实插入了
这里写图片描述

使用python插入

使用peewee模块链接数据库


import peewee

db = peewee.MySQLDatabase( host="localhost", port=3306, user="root", password="123456", database="demo",
)

db.execute_sql("insert into student(name) VALUES ('100%')")
db.close()
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

报错:

TypeError: not enough arguments for format string
  
 
  • 1

可以看出%被格式化字符占用了

解决方法:

1、将sql语句改为

db.execute_sql("insert into student(name) VALUES ('100%%')")
  
 
  • 1

%转义之后就可以正常插入了, 使用%s格式化和 format格式化效果是一样的

这样有个不好的地方,每次传递的参数都需要做修改

2、 execute_sql还有一个参数params,接收一个元组

db.execute_sql("insert into student(name) VALUES (%s)", ("1000%",))
  
 
  • 1

这样也能执行成功,推荐使用此方法,而且还能防止sql注入攻击

这里写图片描述

tips: peewee的数据库链接使用完后需要手动关闭下,加一个close,不然会一直占用连接

可参考:
python 防止sql注入字符串拼接的正确用法

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/81102488

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。