Python学习—数据库篇之pymysql

一、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()
View Code

 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()
View Code

 

查新操作时,不需要执行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)
pymysql查询操作

注意: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 """
View Code

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)
View Code

此外,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 """
View Code

 其他操作

 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)
获取最新自增ID

 

posted @ 2019-03-18 00:53  cdcx  阅读(233)  评论(0编辑  收藏  举报