PyMySQL
# 介绍
PyMySQL是在Python3.x版本中用于连接MySQL数据库的模块,
Python2中则使用mysqldb。
# 游标
# 介绍
游标是数据库操作中用于逐行处理查询结果集的接口,通过pymysql.cursor实现。
常用的游标类型有:Cursor、SSCursor、DictCursor、SSDictCursor。
例如:cur = conn.cursor(pymysql.cursors.SSCursor)
# Cursor
普通的游标对象,默认创建的游标对象。
返回元组类型,元素也为元组类型。
# SSCursor
不缓存游标,获取一次数据后,缓存将被删除。也就是不可重复fetch获取,主要用于当操作需要返回大量数据的时候。
返回列表类型,元素为元组类型。
# DictCursor
以字典的形式返回操作结果。
返回列表类型,元素为字典类型,数据以字段名作为Key。
# SSDictCursor
不缓存游标,获取一次数据后,缓存将被删除。也就是不可重复fetch获取,主要用于当操作需要返回大量数据的时候。
返回列表类型,元素为字典类型,数据以字段名作为Key。
# 模块使用
# 安装
pip3 install mysqldb
1
# 连接MySQL
import pymysql
mysql_conn = pymysql.connect(
host='[主机IP]',
port='[数据库服务端口]'
user='[用户名]',
password='[用户密码]',
database='[数据库名]',
charset='[字符集]')
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
host:MySQL服务的主机。
port:连接MySQL服务的端口,不指定则默认使用:3306。
user:连接MySQL的用户名。
password:连接MySQL的密码。
database:连接的MySQL中的数据库,不指定则只连接MySQL不进入库。
charset:通信采用的编码方式,不指定则默认使用:utf8mb4。
# 执行操作
# 实例化Cursor对象,用于执行SQL语句并获得结果。
# cur = [连接对象].cursor()
cur = mysql_conn.cursor()
# 执行单条SQL语句,并返回受影响的行数。
# cur.execute(SQL语句)
cur.execute("select USERID from user;")
# 执行多条SQL语句,并返回受影响的行数。
# cur.executemany(SQL语句)
queryid = [('123456'), ('22334')]
cur.executemany("select * from user where userid = %s;", queryid)
# 获取最后执行的SQL语句的所有查询结果,如果是使用executemany,则只会返回最后一条SQL语句执行的查询结果。
# cur.fetchall()
print(cur.fetchall())
# 返回指定数量的SQL查询结果的记录行。
# cur.fetchmany(Num)
print(cur.fetchmany(3))
# 提交当前连接执行过的事务,虽然MySQL默认开启了自动提交,但该模块DML语句需要手动提交。
# UPDATE、INSERT、DELETE等语句操作后需要提交事务。
# [连接对象].commit()
mysql_conn.commit()
# 回滚事务,一般会配合异常处理使用,来实现一旦执行SQL语句出错,就进行事务的回滚。
# [连接对象].rollback()
try:
cur.execute(sql1)
cur.execute(sql2)
# 如果没异常报错,则会正常提交。
mysql_conn.commit()
except Exception as e:
print(str(e))
# # 如果有异常报错,则会执行回滚操作。
mysql_conn.rollback()
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
34
35
36
37
38
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
34
35
36
37
38
# 断开MySQL
# 关闭游标对象。
cur.close()
# 关闭连接对象,断开MySQL连接。
mysql_conn.close()
1
2
3
4
5
2
3
4
5
# 防止SQL注入
我们要避免cursor.execute()等方法直接使用完整的SQL,而是通过如下方式,通过参数传递参数,这样方法会校验是否有SQL注入。
queryid = '22334'
queryname = 'hello'
# 位置传参
cur.execute("select * from user where userid = %s;", queryid)
# 字典传参
cur.execute("select * from user where userid = %(userid)s username = %(username)s;", {"userid": queryid}, "username": queryname)
1
2
3
4
5
6
2
3
4
5
6