安装pymysql
pip install PyMySQL
pip命令将PyMySQL安装在 Python的安装目录中
\Python36\Lib\site-packages\PyMySQL-0.8.1.dist-info
使用 PyMySQL的前提
1.您已经创建了数据库。
2.拥有访问数据库的帐号和密码,并且连接数据库具备访问权限。
3.在你的电脑上已经安装了 Python pymysql 模块。
4.必须熟练使用SQL语句。
数据库连接对象使用
1.引入PyMySQL模块
2.使用connect方法连接数据库
3.通过cursor方法创建一个游标对象
4.通过游标执行SQL语句
5.从游标执行结果中读取数据
import pymysql
1. 创建连接对象
语法:
连接对象 = pymysql.connect(
host="连接地址 localhost, ip 地址",
port=端口号,默认3306,
user="用户名",
password="密码",
database="数据库名",
charset="utf8"
)
2. 使用连接对象
a. 创建游标对象
游标对象 = 连接对象.cursor(cursor=None)
参数说明: 指定游标的类型
`Cursor`: 默认
`SSCursor`: 默认基础上采用生成器
`DictCursor`: 字典类型游标
`SSDictCursor`: 在字典采用生成器方式
例如: cnn.cursor(cursor=pymysql.cursors.SSDictCursor)
b. 切换数据库
数据库连接对象.select_db(数据库名)
c. 关闭连接
连接对象.close()
例子:
# 创建连接对象
import pymysql
from pymysql.cursors import SSCursor
# from config import db
# print(db)
#cnn = pymysql.connect(**db) # 创建连接对象
# cnn.select_db("test") # 切换数据库
# print(cnn)
cnn = pymysql.connect(
host="localhost",
port=3306,
user="root",
password="root",
database="itsource",
charset="utf8"
)
# 创建游标对象
cursor = cnn.cursor(cursor=pymysql.cursors.SSDictCursor) # alt + enter 反向导入模块
# 准备sql
sql = "select * from student"
# 执行sql,发送
cursor.execute(sql)
# 使用游标获取数据
data = cursor.fetchall()
print(data)
# 关闭连接
cursor.close()# 先关闭游标对象
cnn.close()#再关闭连接对象
游标对象使用–%s占位符sql使用
1. 游标对象用于执行sql语句
语法:
游标对象.execute(sql,args=None)
传参数的方式说明:
1. 如果是完整的sql语句, 就直接传第一个参数即可
备注: 如果通过传入的形式拼接的sql语句,容易造成sql注入的风险.
sql注入: 恶意用户构建特殊sql参数传入,从而非法获取数据.
2. 如果sql语句是使用 %s 占位的时候,必须使用第二个参数args(实际的数据)
例子: sql = "select * from student where name=%s and age=%s"
args = ["张飞",51] #列表或者元组
游标对象.execute(sql,args)
了解:
游标对象.executemany(sql,args=[(数据1,数据2),(数据1,数据2),(数据1,数据2)])
同一条sql执行多次
2. 游标对象获取数据
游标对象.fetchall(): 获取所有
游标对象.fetchone(): 获取下一条(每执行一次获取一条)
游标对象.fetchmany(number): 获取指定条数据
3. 游标的关闭
游标对象.close()
备注: 建议每次使用完游标执行和获取数据之后立马关闭游标
提供一个上下文管理器的语法, 自动关闭(任何打开的东西)
with 连接对象.cursor() as cursor:
# 使用游标cursor 执行和获取数据, 自动关闭游标
文件操作
with open("./data.txt","r",encoding="utf-8") as fp:
fp.read()
例子1:
# 导入pymysql
import pymysql
from config import db
# 创建连接对象
cnn = pymysql.connect(**db)
# 通过连接对象创建游标对象
cursor = cnn.cursor(cursor=pymysql.cursors.DictCursor)
# %s 占位的sql语句
name = input("请输入姓名:")
age = input("请输入年龄:")
sql = "select * from student where name=%s and age=%s"
args = [name,age]
cursor.execute(sql,args)
例子2:
# 用户传入姓名和年龄,不使用占位符会导致sql注入风险
name = input("请输入姓名:") # 'or 1 or' 'or 1 #
age = input("请输入年龄:")
sql = "select * from student where name='{}' and age={}".format(name,age) #完整的sql语句
print(sql)
cursor.execute(sql)
# 获取数据
data = cursor.fetchall()
print(data)
data = cursor.fetchone()
print(data)
data = cursor.fetchmany(5)
print(data)
print(len(data))
游标对象使用–添加多条数据executemany
# 导入pymysql
import pymysql
from config import db
# 创建连接对象
cnn = pymysql.connect(**db)
# 通过连接对象创建游标对象
cursor = cnn.cursor(cursor=pymysql.cursors.DictCursor)
# 准备sql
sql = "insert into student(name,age,sex,class_id,money) values (%s,%s,%s,%s,%s)"
args = [
("小黄黄1", 25, "男", 2, 250),
("小黄黄2", 25, "男", 2, 250),
("小黄黄3", 25, "男", 2, 250)
]
# 一次执行多条数据
num = cursor.executemany(sql, args)
print(num)
if num > 0:
# 提交事务
cnn.commit()
print("添加成功!")
事务使用
d. 事务操作的方法
连接对象.begin(): 开启事务,默认开启
连接对象.commit(): 提交事务
连接对象.rollback(): 回滚事务
注意: pymysql 鉴于安全考虑,所有的写(insert,delete,update)操作都必须使用事务
例子:
# 导入
import pymysql
from config import db
# 创建连接对象
cnn = pymysql.connect(**db)
try:
# 创建游标对象
with cnn.cursor(cursor=pymysql.cursors.DictCursor) as cursor:
# 准备sql语句
# 猪八戒少200
sql_1 = "update student set money=money-200 where name=%s"
args_1 = ["猪八戒1"]
num = cursor.execute(sql_1, args_1) # 返回受影响的行数
if num == 0: # 转账失败!
# 手动抛出异常
raise Exception("该用户不存在!")
# 貂蝉多200
sql_2 = "update student set money=money+200 where name=%s"
args_2 = ["貂蝉"]
num = cursor.execute(sql_2, args_2)
if num == 0: # 转账失败!
# 手动抛出异常
raise Exception("该用户不存在!")
# 提交事务
cnn.commit()
print("转账成功!")
except Exception as e:
# 出现异常说明转账失败, 应该回滚事务
cnn.rollback()
print("转账失败!", e)