洗礼灵魂,修炼python(91)-- 知识拾遗篇 —— pymysql模块之python操作mysql增删改查
首先你得学会基本的mysql操作语句:mysql学习
其次,python要想操作mysql,靠python的内置模块是不行的,而如果通过os模块调用cmd命令虽然原理上是可以的,但是还是不太方便,那么这个问题,很早就有人想过了,而且还做出来了,不废话,就是第三方模块pymysql和mysqldb了。
但是,python3暂不支持mysqldb,pymysql却是python2和3都支持的
所以,本篇博文说说pymysql,学了pymysql,mysqldb其实你也会了
pymysql
1.安装
使用pip安装:
2.使用
增:
1)固定数据插入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!usr/bin/env python #-*- coding:utf-8 -*- # author:yangva import pymysql # 创建数据库连接 conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = ' ',db=' test') # 创建游标,这里的游标你可以理解为文本操作里的walk指针 cursor = conn.cursor() # sql语句 cursor.execute( 'insert into user(name,age,part_id) VALUES("ling",32,2)' ) # 提交数据,你可以理解为文本操作里的flush()刷新缓存存储为数据 conn.commit() # 关闭连接 cursor.close() conn.close() |
在运行之前,先看下数据库里的数据:
好的,开始运行:
运行结果:
没有报错就是好消息,再看下数据有变化没有:
好的,插入进去了
先看图:
其实你有没有发现,这些都是固定的格式,就和socket差不多,就标注的那两句是有变化的,第一句是连接数据库等设置,第二据就是我们的sql语句,那么问题就简单了对吧?
然后,如果你插入的数据希望是中文的,还可以在第一句创建数据库连接时时加一个参数charset:
1 2 | # 创建数据库连接 conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = ' ',db=' test ',charset=' utf8') |
2)字符串拼接活动插入:
那么再看,如果我们让用户自己输入待插入的数据呢:
其他不变,只修改这一部分
A:多个列数据插入
注意上面的VALUES()里不用再加引号,因为input里已经有引号了
运行结果:
B:如果你只是插入一单个数据,可以这样:
C:那么有朋友要问了,为什么不这样作字符串拼接呢:
这个方法虽然也可行,但是是明令禁止的,因为可能会出现sql注入漏洞,而用上面的方法的话,execute()方法可以传入两个参数,自动帮我们字符串拼接好了
D:sql注入漏洞范例:
看到了吧,其实我的表里并没有23的部门id对吧,但是还是查询出来了,那么如果查询的表是保存的所有用户名和密码呢?这个注入是不是很可怕了对吧?
还有更多的注入语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 万能密码: 'or' = 'or' select * from table where username= '' or '=' or '' and password = '' ; "or" a "=" a ')or(' a '=' a ")or(" a "=" a 'or 1=1-- "or 1=1-- ' or "= ' ' or 1=1%00 'or 1=1/* admin' or 1=1/* |
所以一般不用这种字符串拼接的方法,还是使用pymysql给我们封装好的方法execute和executemany
E:插入一个可迭代对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #!usr/bin/env python #-*- coding:utf-8 -*- # author:yangva import pymysql # 创建数据库连接 conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = ' ',db=' test ',charset=' utf8') # 创建游标 cursor = conn.cursor() user1 = input ( '请输入待插入的姓名:' ) age1 = input ( '请输入待插入的年龄:' ) id1 = input ( '请输入待插入的部门id:' ) print ( '已记录' ) user2 = input ( '请输入待插入的姓名:' ) age2 = input ( '请输入待插入的年龄:' ) id2 = input ( '请输入待插入的部门id:' ) print ( '已记录' ) li = [(user1,age1,id1), (user2,age2,id2) ] # sql语句 cursor.executemany( 'insert into user(name,age,part_id) VALUES(%s,%s,%s)' ,li) # 提交数据 conn.commit() # 关闭连接 cursor.close() conn.close() |
注意上面我插入sql语句的方法已经改成executemany,不然使用execute方法会报错
运行结果:
改:
目前表里的数据是这些:
还是上面那语句,只改了这一块,其他不变
运行结果:
完全OjbK
删:
先看下目前的数据:
同样的,其他不变,就下面这一段有变化
运行结果:
一样的OjbK
查:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!usr/bin/env python #-*- coding:utf-8 -*- # author:yangva import pymysql # 创建数据库连接 conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = ' ',db=' test ',charset=' utf8') # 创建游标 cursor = conn.cursor() # sql语句 cursor.execute( 'select * from user' ) print (cursor.fetchone()) # 关闭连接 cursor.close() conn.close() |
注意:使用查询语句时不用给commit()方法,因为没有修改数据,只是把数据拿出来而已,增删改都有对数据进行修改的操作,所以需要使用commit
能理解吧?
查询时,需要使用fetchone(),fetchmany([int]),fetchall()来得到查询的结果
fetchone运行结果:
fetchmany运行结果:
fetchall()运行结果:
如果你想同时使用fetchone,fetchmany,fetchall的话,会成这样:
我想,你应该能看懂,不用我多说,反正你知道它就和文本读取操作是一样的,都有指针
那么你说,我就是想同时使用上面的三个fetch方法,并且我想让它都能正确的取到希望的数据,这个怎么办呢?在文本操作里我们可以使用seek()来设定指针位置,那么这里使用什么方法呢?
1 2 | cursor.scroll( 0 ,mode = 'absolute' ) #相对当前位置移动 cursor.scroll( 0 ,mode = 'relative' ) #相对绝对位置移动 |
没错了,使用这个scroll方法就可以修改指针位置了
好的,现在再看看:
补充:如果你插入数据后,希望知道自增列有多少数据了,可以使用代码查看:
1 | row = cursor.lastrowid |
完美!O了,本篇博文结束
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】