一、pymysql简介
对于Python操作MySQL主要使用两种方式:
- 原生模块 pymsql
- ORM框架 SQLAchemy
pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。
二、简单使用
# -*- coding:utf-8 -*- # author: cdc # date: 2019/3/18 import pymysql # 创建连接 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8') # 创建游标 cursor = conn.cursor() #执行sql操作 r = cursor.execute("insert into student(age,sex,class_no) values(16,'male',2)") # r为执行sql语句后受影响的行数 print(r) # 提交,不然无法保存新建或者修改的数据 conn.commit() # 关闭游标 cursor.close() # 关闭连接 conn.close()
三、增删改查
增
1 # -*- coding:utf-8 -*- 2 # author: cdc 3 # date: 2019/3/18 4 5 import pymysql 6 7 # 创建连接 8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8') 9 # 创建游标 10 cursor = conn.cursor() 11 12 # 增加一行数据 13 cursor.execute("insert into tb1(name,part) values('cdc',1)") 14 15 # 字符串拼接sql(禁止使用,会引起sql注入) 16 inp_1 = ('cdcy',2,) 17 sql = "insert into tb1(name,part) values('%s','%s')" % inp_1 18 cursor.execute(sql) 19 20 # 带参数插入数据(推荐使用) 21 inp_2 = ('cdcx',2) 22 cursor.execute("insert into tb1(name,part) values(%s,%s)",inp_2) 23 24 25 # 增加多行数据 26 lis = [('cdc1',2), 27 ('cdc2',2), 28 ('cdc3',2), 29 ] 30 cursor.executemany("insert into tb1(name,part) values(%s,%s)",lis) 31 32 # 提交,不然无法保存新建或者修改的数据 33 conn.commit() 34 # 关闭游标 35 cursor.close() 36 # 关闭连接 37 conn.close()
删
1 # -*- coding:utf-8 -*- 2 # author: cdc 3 # date: 2019/3/18 4 5 import pymysql 6 7 # 创建连接 8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8') 9 # 创建游标 10 cursor = conn.cursor() 11 #执行sql操作 12 r = cursor.execute("delete from tb1 where name=%s",('alex',)) 13 # r为执行sql语句后受影响的行数 14 print(r) 15 # 提交,不然无法保存新建或者修改的数据 16 conn.commit() 17 # 关闭游标 18 cursor.close() 19 # 关闭连接 20 conn.close()
改
1 # -*- coding:utf-8 -*- 2 # author: cdc 3 # date: 2019/3/18 4 5 import pymysql 6 7 # 创建连接 8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8') 9 # 创建游标 10 cursor = conn.cursor() 11 #执行sql操作 12 r = cursor.execute("update tb1 set name=%s where part=%s",('ccc',1,)) 13 # r为执行sql语句后受影响的行数 14 print(r) 15 # 提交,不然无法保存新建或者修改的数据 16 conn.commit() 17 # 关闭游标 18 cursor.close() 19 # 关闭连接 20 conn.close()
查
查新操作时,不需要执行commit操作
1 # -*- coding:utf-8 -*- 2 # author: cdc 3 # date: 2019/3/18 4 5 import pymysql 6 7 # 创建连接 8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8') 9 # 创建游标 10 cursor = conn.cursor() 11 # 查询数据 12 cursor.execute('select * from tb3') 13 14 # 展示一行 15 result = cursor.fetchone() 16 print(result) 17 result = cursor.fetchone() 18 print(result) 19 20 # 展示多行 21 result = cursor.fetchmany(3) 22 print(result) 23 24 # 展示全部 25 result = cursor.fetchall() 26 print(result)
注意:fetch操作的机制类似于文件操作中的指针,会在上一次的展示基础位置上继续往下展示n行数据
1 # -*- coding:utf-8 -*- 2 # author: cdc 3 # date: 2019/3/18 4 5 import pymysql 6 7 # 创建连接 8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8') 9 # 创建游标 10 cursor = conn.cursor() 11 # 查询数据 12 cursor.execute('select * from tb3') 13 14 # 展示一行 15 result = cursor.fetchone() 16 print(result) 17 result = cursor.fetchone() 18 print(result) 19 20 # 展示多行 21 result = cursor.fetchmany(3) 22 print(result) 23 24 25 # ******************** 执行结果 *************** 26 """ 27 (1, 'cdc', 1) 28 (2, 'ccc', 1) 29 ((3, 'ctt', 3), (4, 'lj', 4), (5, 'xx', 5)) 30 """
fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
- cursor.scroll(n,mode='relative') # 相对当前位置移动,即从当前位置向前或者向后移动n个位置,再进行数据展示
- cursor.scroll(n,mode='absolute') # 相对绝对位置移动,即从当前位置回到n位置后,再进行数据的展示
1 # -*- coding:utf-8 -*- 2 # author: cdc 3 # date: 2019/3/18 4 5 import pymysql 6 7 # 创建连接 8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8') 9 # 创建游标 10 cursor = conn.cursor() 11 # 查询数据 12 cursor.execute('select * from tb3') 13 14 # 展示一行 15 result = cursor.fetchone() 16 print(result) 17 result = cursor.fetchone() 18 print(result) 19 20 # 向前移动一个位置 21 """ 22 (1, 'cdc', 1) 23 (2, 'ccc', 1) 24 (2, 'ccc', 1) 25 """ 26 cursor.scroll(-1,mode='relative') 27 28 # 向后移动一个位置 29 """ 30 (1, 'cdc', 1) 31 (2, 'ccc', 1) 32 (4, 'lj', 4) 33 34 """ 35 cursor.scroll(1,mode='relative') 36 result = cursor.fetchone() 37 print(result)
此外,fetch操作默认获取的数据是元祖类型,如果想要或者字典类型的数据,可以通过改变游标的方式实现:
1 # -*- coding:utf-8 -*- 2 # author: cdc 3 # date: 2019/3/18 4 5 import pymysql 6 7 # 创建连接 8 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8') 9 # 创建游标 10 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) 11 # 查询数据 12 cursor.execute('select * from tb3') 13 14 # 展示全部 15 result = cursor.fetchall() 16 print(result) 17 18 # ********* 执行结果 ************ 19 """ 20 [{'part_no': 1, 'name': 'cdc', 'no': 1}, {'part_no': 1, 'name': 'ccc', 'no': 2}, {'part_no': 3, 'name': 'ctt', 'no': 3}, {'part_no': 4, 'name': 'lj', 'no': 4}, {'part_no': 5, 'name': 'xx', 'no': 5}, {'part_no': 9, 'name': 'cc', 'no': 6}, {'part_no': 5, 'name': 'fdc', 'no': 7}] 21 """
其他操作
1 # 注:必须得有自增列 2 3 import pymysql 4 5 # 创建连接 6 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='cdc19951216', db='test',charset='utf8') 7 # 创建游标 8 cursor = conn.cursor() 9 # 查询数据 10 cursor.execute('insert into class(address) values(%s)',('class_3',)) 11 12 new_id = cursor.lastrowid 13 print(new_id)