PyMySQL模块
【一】简介
-
DB-API:
- Python标准数据库规范为 DB-API, DB-API定义了一系列必须的对象和数据库操作方式,以便为各种数据库系统和数据库访问程序提供一致的访问接口。
-
PyMySQL:
- 纯python实现的模块,可以与Python代码兼容衔接,也几乎兼容MySQL-python
- 遵循Python数据库API v2.0规范
- 官网:https://zetcode.com/python/pymysql/
【二】使用方法介绍
1)安装
pip install pymysql
pip install cryptography
2)连接语法
# 导入模块
impoort pymysql
# 创建连接对象(简介版)
conn = pymysql.connect(
user='root', # 用户名
ppassword='123456', # 密码
host='127.0.0.1', # ip(本地:127.0.0.1 / localhost)
port=3306, # 端口
database='day_05' # 需要连接的数据库
)
# 常见的参数
def __init__(
self,
*,
user=None, # 用户名
password="", # 密码
host=None, # ip(本地:127.0.0.1 / localhost)
database=None, #需要连接的数据库
port=0, # 端口
charset="", # 编码集
sql_mode=None, # 严格模式
cursorclass=Cursor, # 获取查询集的显示结果样式
autocommit=False, #自动执行提交
)
3)主要方法介绍
方法 | 功能 |
---|---|
cursor() | 获取游标对象,操作数据库,如执行DML操作,调用存储过程等 |
commit() | 提交事务 |
rollback() | 回滚事务 |
close() | 关闭数据库连接 |
【三】基础功能介绍
1)创建连接对象
import pymysql
conn = pymysql.connect(
user='root',
password='123456',
host='localhost',
port=3306,
database='day_05',
# autocommit=True 自动提交事务
charset='utf8mb4'
)
# 创建游标,查询结果以元组形式返回
cursor = conn.cursor()
2)查询结果
1.查询所有结果(fetchall)
sql = 'select * from user'
# 执行
cursor.execute(sql)
# 返回结果
result = cursor.fetchall()
print(result)
# ((1, 'ST1', 'woman', 41), (2, 'ST2', 'woman', 24), (3, 'ST3', 'man', 38), (4, 'ST4', 'woman', 31), (5, 'ST5', 'man', 28))
2.获取一行数据(fetchone)
sql = 'select * from user'
# 执行
cursor.execute(sql)
# 返回结果
result = cursor.fetchone()
print(result)
# (1, 'ST1', 'woman', 41)
3.获取指定数量数据(fetchmany)
sql = 'select * from user'
# 执行
cursor.execute(sql)
# 返回结果
result = cursor.fetchmany(2)
print(result)
# ((1, 'ST1', 'woman', 41), (2, 'ST2', 'woman', 24))
4.移动光标
cursor.scroll(1, 'relative') # 相对于当前位置往后移动一个单位
cursor.scroll(1, 'absolute') # 相对于起始位置往后移动一个单位
sql = 'select * from user'
# 执行
cursor.execute(sql)
# 返回结果
result = cursor.fetchmany(size=0)
print(result)
# ((1, 'ST1', 'woman', 41),)
# 相对于当前位置往后移动一个单位
cursor.scroll(1, 'relative')
result = cursor.fetchone()
print(result)
# (3, 'ST3', 'man', 38)
# 相对于起始位置往后移动一个单位
cursor.scroll(1, 'absolute')
result = cursor.fetchone()
print(result)
# (2, 'ST2', 'woman', 24)
3)插入操作
插入操作中的参数可以以元组、列表、字典形式传入
转换说明符 | 解释 |
---|---|
%d、%i | 转换为带符号的十进制数 |
%o | 转换为带符号的八进制数 |
%x、%X | 转换为带符号的十六进制数 |
%e | 转化为科学计数法表示的浮点数(e 小写) |
%E | 转化为科学计数法表示的浮点数(E 小写) |
%f、%F | 转化为十进制浮点数 |
%g | 智能选择使用 %f 或 %e 格式 |
%G | 智能选择使用 %F 或 %E 格式 |
%c | 格式化字符及其ASCII码 |
%r | 使用 repr() 函数将表达式转换为字符串 |
%s | 使用 str() 函数将表达式转换为字符串 |
1.直接写原生的SQL语句
sql = 'insert into user (name,sex,age) values (%s,%s,%s)'
cursor.execute(sql, ['ST-1', 'man', '18'])
cursor.execute(sql, ('ST-2', 'woman', '20'))
conn.commit()
2.一次插入多个数据
sql = 'insert into user (name,sex,age) values (%s,%s,%s)'
# 需为列表模式
user_all = [('ST-3', 'man', '18'),('ST-4', 'woman', '20')]
cursor.executemany(sql, user_all)
conn.commit()
4)更新数据
1.直接写
# id为3的age改成30
cursor = conn.cursor()
sql = 'update user set age = "30" where id = 3'
cursor.execute(sql)
conn.commit()
2.占位
cursor = conn.cursor()
sql = 'update user set age = %s where id = %s'
cursor.execute(sql,[31,3])
conn.commit()
3.关键字占位
cursor = conn.cursor()
sql = 'update user set age = %(new_age)s where id = %(id)s'
cursor.execute(sql, {'new_age': 32, 'id': 3})
conn.commit()
5)删除数据
1.直接写
cursor = conn.cursor()
sql = 'delete from user where id=2'
cursor.execute(sql)
conn.commit()
2.占位
cursor = conn.cursor()
sql = 'delete from user where id=%s'
cursor.execute(sql,[10])
conn.commit()
3.关键字占位
cursor = conn.cursor()
sql = 'delete from user where id=%(id)s'
cursor.execute(sql,{'id':11})
conn.commit()
【四】SQL注入问题
1)概念
-
SQL语句中的
--
为注解 -
若其出现在sql语句中会出现后面的内容无法执行
-
例如在登录语句,在用户名之后出现
--
会使不正确的密码也显示登录成功
2)解决思路
- 使用官方提供并建议的传值方式进行传值,
- %s、%(name)s