python ---使用python操作mysql ---> pymysql

本章内容:

1:能够完成从MySQL中读取出数据; 重点

查询: execute()、fetchall()

2:能够将数据写入MySQL数据库。 重点

插入数据: execute() sql = insert into xxx

掌握pymysql模块的安装

==目标:==了解如何安装pymysql模块?

当要使用Python和MySQL数据库进行交互,需要借助一个第三方模块:pymysql。

在使用pymysql模块前,先进行安装:

复制代码
pip install pymysql

有时使用pip install xxx命令安装时较慢,若要提升pip下载的速度,可采用命令:

在终端安装

复制代码
pip install 模块名 [-i 镜像源地址]
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pymysql -i http://mirrors.aliyun.com/pypi/simple/

比如,在国内的镜像源中,有很多可供使用的源地址:

镜像来源 镜像源地址
豆瓣 http://pypi.douban.com/simple/
阿里云 Simple Index
清华大学 Simple Index
中国科技大学 Simple Index
华中理工大学 http://pypi.hustunique.com/
山东理工大学 Loading...

当成功安装pymysql模块后,可直接导入使用:

复制代码
# 导入模块
import pymysql

例如,一起来完成:

(1)在Python中,使用命令安装pymysql模块;

(2)当成功安装模块后,即可导入并验证是否已成功安装;

(3)思考:还有其他方式安装模块吗?

==总结:==

(1)当要在Python中安装pymysql模块,可以使用()命令;==A、pip install pymsql==;B、install pymysql;

(2)注意:当要使用pymysql模块时,可以直接导入使用,语法:import pymysql。

了解pymysql的操作步骤

==目标:==了解pymysql的操作步骤。

在Python中,使用pymysql模块来操作MySQL数据的基本步骤

对于图解,操作步骤说明:

复制代码
(1)导入模块;
(2)创建连接对象;
(3)创建游标对象;
(4)使用游标对象执行SQL并进行增删改查;
(5)关闭游标对象;
(6)关闭连接对象。

例如,一起来了解:

(1)操作pymysql模块的基本步骤;

(2)对各个步骤做详细说明。

==详细步骤:== 用户名 密码 ip地址使用自己的

python 复制代码
(1)导入模块;
	导入模块前, 优先安装pymysql模块: pip install pymysql
	import pymysql
	# 使用模块操作MySQL数据库
----------------------------------
(2)创建连接对象;
	db_conn = pymysql.connect()
		# 用户名 root
		# 密码 123456
		# IP地址 127.0.0.1    localhost 
		# 端口号 3306
		# 数据库名 班级名_db_xxx
		# 编码格式 utf8   gbk
----------------------------------
(3)创建游标对象;
	db_cursor = db_conn.cursor()
		# 游标获取数据
----------------------------------
(4)使用游标对象执行SQL并进行增删改查;
	db_cursor.execute(xxxx)
		# 增 insert into 表名[(字段1, 字段2, ...)] values(值1, 值2,...)[,(值1, 值2,...),...][;]
		# 删 delete from 表名 [where 条件];
		# 改 update 表名 set 字段1=值1[, 字段2=值2, ...] [where 条件];
		# 查 select *[字段1, 字段2, ...] from 表名 [where 条件];
----------------------------------
(5)关闭游标对象;
	close()
----------------------------------
(6)关闭连接对象。
	close()

==总结:==

(1)当操作完pymysql后,需要对连接、游标等对象资源进行关闭,可以使用()方法;A、exit();==B、close();==

(2)注意:为了便于使用和操作pymysql模块,建议按照操作步骤来进行处理。

了解connection对象

==目标:==了解connection对象的常用方法。

我们都知道,在使用MySQL数据库前,首先需要登录并进行连接。命令行、DataGrip

类似地,在使用pymysql模块时,也需要登录并进行连接,且此时需要使用connection对象。

connection是用于建立与数据库的连接,需要使用pymysql模块来调用:

函数 含义
connect(host=None, port=0, user=None, password="", database=None, charset='',...) 用于创建Connection连接对象。 ①host:表示连接MySQL的IP地址。若为本机,则可表示成'localhost'或'127.0.0.1';若为其他计算机,则表示为具体IP地址; ②port:表示连接的MySQL的端口号,默认是3306; ③user:表示连接的用户名,默认是root; ④password:表示连接的密码; ⑤database:表示数据库的名称; ⑥charset:表示采用的编码方式,设定为'utf8'即可。

当成功通过connect()获取并得到连接对象后,常用函数:

函数 含义
commit() 用于事务提交,在进行数据操作时需要进行事务提交后才会生效。
close() 用于关闭连接。
cursor() 用于返回cursor对象,可使用该对象来执行SQL语句并获取结果。

说明:

(1)使用pymysql模块时,已默认开启了事务,因此要让数据操作生效,则必须要进行事务提交;

(2)为了节约系统内存资源,通常在使用完Connection连接对象后,要进行close()关闭连接。

==总结:==

(1)通常情况下,使用pymysql连接MySQL数据库,需要知道:IP地址、()、用户名、密码;==A、端口号==;B、权限

(2)注意:pymysql模块操作MySQL是默认已经开启了事务。

了解cursor对象

==目标:==了解cursor对象的常用方法。

若要执行SQL语句时,则需要使用cursor对象,可通过connection对象的cursor()方法进行创建。

函数 含义
cursor() 用于返回cursor对象,可使用该对象来执行SQL语句并获取结果。

当有了cursor对象后,常用函数:

函数 含义
execute(operate , param) 用于执行SQL语句,返回受影响的行数。 其中,参数operate为字符串类型,表示SQL语句; 参数parameters为列表类型,表示SQL语句中的参数。
fetchone() 在执行查询语句时,获取查询结果集的第一行数据,返回一个元组,即(v1, v2,...)。
fetchall() 在执行查询时,获取结果集的所有行,返回一个元组,即((v11, v12,...), (v21, v22,...),...)。
close() 关闭cursor对象。

说明:

(1)使用execute()执行SQL语句时,SQL语句应写成字符串型;

(2)当关闭connection和cursor对象时,记得先关闭cursor游标,后关闭connection连接。

==总结:==

(1)当要使用cursor游标对象来执行SQL语句时,可以使用()方法;A、catch();==B、excute();==

(2)注意:在使用pymysql执行SQL语句时,要使用cursor对象来操作。

数据记录操作

了解准备数据表

==目标:==完成数据表的准备工作。

通常情况下,在使用pymysql模块前,会先创建好数据库和数据表字段信息。

这样,可以更便于后期操作。

例如,使用MySQL命令完成:

(1)创建一个班级db_students数据库,并设定为utf8编码;

(2)在库中新建一个数据表,包含编号id、姓名name、性别gender、年龄age等字段;

(3)其中,字段编号id为整型、主键且自动增长;

(4)操作完成后,查看表结构,并查看表内是否有数据内容。

sql 复制代码
######################新建库和表#############################
# 创建库
create database if not exists zz20db_students charset utf8;
# 使用库
use zz20db_students;
# 查看表信息
show tables;
# 创建表
create table if not exists student(
    id int primary key auto_increment,
    name varchar(20),
    gender varchar(10),
    age int
) engine = InnoDB default charset utf8;
# 查看表字段
desc student;
# 查看表数据
select * from student;

==总结:==

(1)在操作pymysql前,请记得先创建好数据表,便于后面的程序执行。

掌握插入数据

==目标:==掌握pymysql模块插入数据的使用。

当已成功创建好了数据库和数据表,就可以使用pymysql来给表内添加数据了。使用函数:

函数 含义
execute(operate , param) 用于执行SQL语句,返回受影响的行数。 其中,参数operate为字符串类型,表示SQL语句; 参数parameters为列表类型,表示SQL语句中的参数。

说明:

param参数是可选项。

例如,使用pymysql模块来完成:

(1)使用execute()向学生表中插入1条学生数据;

(2)使用DataGrip查看添加成功后的数据结果;

(3)思考:如果要插入两条数据,该怎么做呢?

python 复制代码
# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

# 4、使用游标来执行sql
result = db_cursor.execute("insert into student(name,gender,age) values ('刘备','男',23)")
print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)当使用pymysql模块插入数据,必须使用()方法提交事务;A、submit();==B、commit();==

(2)注意:使用PyCharm编写程序插入数据成功后,可以到DataGrip中查看是否已成功添加数据。

掌握修改数据

==目标:==掌握execute()修改数据的使用。

当数据显示有误时,就需要来修改数据内容。使用函数:

函数 含义
execute(operate , param) 用于执行SQL语句,返回受影响的行数。 其中,参数operate为字符串类型,表示SQL语句; 参数parameters为列表类型,表示SQL语句中的参数。

说明:

param参数是可选项。

例如,使用pymysql模块来完成:

(1)使用execute()修改学生表中id为1的数据,并把年龄修改为19岁,姓名修改为王军;

(2)使用DataGrip查看修改成功后的数据结果;

(3)思考:能否把性别为男的所有数据,性别都修改为Male呢?

python 复制代码
# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

# 4、使用游标来执行sql
result = db_cursor.execute("""
    update student set name = '大乔' where id = 4
    """)
print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)当使用pymysql模块修改数据,要使用commit()方法进行提交事务;

(2)注意:若要修改数据表的数据内容,必须先已存在该数据。

掌握删除数据

==目标:==掌握如何使用execute()删除数据。

当数据内容已失效时,就需要来删除数据内容。使用函数:

函数 含义
execute(operate , param) 用于执行SQL语句,返回受影响的行数。 其中,参数operate为字符串类型,表示SQL语句; 参数parameters为列表类型,表示SQL语句中的参数。

说明:

param参数是可选项。

例如,使用pymysql模块来完成:

(1)使用execute()删除学生表中id为2的这条数据;

(2)使用DataGrip查看删除成功后的数据结果;

(3)思考:目前,使用execute()操作数据时,都采用硬编码方式,会存在什么问题吗?

python 复制代码
# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

# 4、使用游标来执行sql
result = db_cursor.execute("""
    delete from student where name = '曹操'
    """)
print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)当要删除数据记录时,应该使用()关键字;==A、delete==;B、drop;

(2)注意:使用pymysql模块删除数据时,也需要进行提交事务。

了解SQL注入

==目标:==了解什么是SQL注入?

SQL注入指的是:恶意篡改或注入SQL条件。

当开发者的数据条件若被恶意篡改,那就达不到预期的查询效果。

为了了解SQL注入是怎么回事?通过一个案例来分析。

例如,使用命令来完成:

(1)给学生表tb_student中添加一些数据,查看效果;

(2)查询age=22的这条数据的所有信息;

(3)使用SQL注入方式来恶意篡改查询条件,比如在条件结尾处,添加or 1=1,并查询结果;

(4)思考:对比两次查询结果,该如何解决这类SQL注入问题呢?

python 复制代码
# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

input_id = input('请输入你要删除的id:')  # 从键盘输入: 88 or 1=1
# 4、使用游标来执行sql                   # 发现所有数据都被删除,因为or后边的条件永远成立,条件永远为真
result = db_cursor.execute(f"""
    delete from student where id = {input_id}   
    """)
print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)恶意篡改或注入新的SQL条件的行为叫做();==A、SQL注入==;B、SQL添加;

(2)注意:当恶意篡改了SQL条件后,查询的结果可能达不到预期效果。

掌握语句参数化

==目标:==掌握语句参数化的使用。

如果要解决SQL注入的问题,在pym

语句参数化是指以%s表示值,然后再传入具体的参数值进行替换。

为了更好理解语句参数化,可以把SQL语句的参数化、值,简要地理解为print()函数中的格式化符号输出:

复制代码
print("xxx%s, xxx%d"%(name, age))

要使用cursor对象的函数:

函数 含义
execute(operate, param) 用于执行SQL语句,返回受影响的行数。 其中,参数operation为字符串类型,表示具体的SQL语句,注意,若在SQL语句中要向外传入参数值,则该参数均使用%s表示; 参数parameters为列表类型,表示SQL语句中的参数。

说明:

param参数的类型是列表list。

例如,使用pymysql模块来完成:

(1)通过键盘录入的方式输入变化的数据值;

(2)使用语句参数化和execute()给数据表添加一条数据内容;

(3)操作完成后,使用DataGrip查看添加成功后的数据结果。

python 复制代码
# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

input_id = input('请输入你要删除的id:')  # 从键盘输入: 88 or 1=1
params = [input_id]
# 不管你从键盘输入什么都会当做普通字符串赋值给%s,id = '88 or 1=1'  -以前--> id = 88 or 1=1
sql= "delete from student where id =  %s "  
# 4、使用游标来执行sql                  
result = db_cursor.execute(sql,params)

print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()
python 复制代码
# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()

param = ['张飞','男',33]
sql = 'insert into student(name,gender,age) values (%s,%s,%s)'
result = db_cursor.execute(sql, param)


print(result) # 返回影响的行数

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)请问:语句参数化时,必须使用%s表示参数,这句话正确吗?==A、正确==;B、错误;

(2)注意:要进行语句参数化时,使用execute()方法时需要传递两个参数。

掌握查询数据

==目标:==掌握pymysql查询数据操作。

查询数据,要使用cursor对象的函数:

函数 含义
execute(operate , param) 用于执行SQL语句,返回受影响的行数。 其中,参数operation为字符串类型,表示具体的SQL语句,注意,若在SQL语句中要向外传入参数值,则该参数均使用%s表示; 参数parameters为列表类型,表示SQL语句中的参数。
fetchone() 在执行查询语句时,获取查询结果集的第一行数据,返回一个元组,即(v1, v2,...)。
fetchall() 在执行查询时,获取结果集的所有行,返回一个元组,即((v11, v12,...), (v21, v22,...),...)。

说明:

查询的数据结果是元组类型。

例如,使用pymysql模块来完成:

(1)使用fetchone来查询一条某xx姓名的数据信息;

(2)使用fetchall()查询出所有数据信息,并遍历出详细信息。

python 复制代码
# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()


# 执行sql,进行查询
sql = 'select * from student'
db_cursor.execute(sql)

# 获取查询结果,获取一行
print(db_cursor.fetchone())

print('--------------------')
# 获取查询结果,获取多行,并遍历
result = db_cursor.fetchall()

for row2 in result:
    print(row2)
python 复制代码
# 1、导入模块
import pymysql

# 2、创建连接对象
conn = pymysql.connect(
    host='192.168.88.100',
    port=3306,
    user='root',
    password='123456',
    database= 'zz20db_students',
    charset='utf8'
)
print(conn)  # 测试一下服务器是否联通

# 3、获取游标
db_cursor = conn.cursor()


# 执行sql,进行查询,男性,年龄大于20岁的学生信息
gender = input('请输入你要查询的性别: ')
age = input('请输入你要查询的年龄: ')

params = [gender,age]
sql = 'select * from student where gender = %s and age > %s'  # %s 表示占位符
db_cursor.execute(sql,params)

print('--------------------')
# 获取查询结果,获取多行,并遍历
result = db_cursor.fetchall()

for row2 in result:
    print(row2)

# 5、增删改之后,一定要让操作生效,必须要提交事务,否则不生效
conn.commit()

# 6、关闭游标对象;
db_cursor.close()

# 7、关闭连接对象。
conn.close()

==总结:==

(1)当要获取所有查询结果数据时,可以使用()方法;A、fetchone();==B、fetchall()==;

(2)注意:虽然查询数据无需提交事务,但还是建议提交一下,这样可以避免与CRUD的差异化。

注册与登录案例

了解注册

==目标:==了解注册用户的使用。

比如,在登录某网站前,是需要进行注册用户的。那么,注册是怎么做的呢?

其实,注册用户本质上就是给用户表添加一条数据。

例如,一起来完成:

(1)新建一个班级db_users数据库,编码为utf8;

(2)在库中新建一个用户表,字段有:编号id主键自增、用户名username、密码password;

(3)使用键盘录入数据的形式输入用户名、密码,并用于注册一个用户;

(4)使用DataGrip查看注册成功后的用户数据结果。

python 复制代码
import pymysql

db_conn = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    password="123456",
    database="sz38db_users",
    charset="utf8"
)
db_cursor = db_conn.cursor()
# 执行插入语句
in_name = input("请输入用户名:")
in_pwd = input("请输入密码:")
params = [in_name,in_pwd]
sql = "insert into tb_user(username,password) values(%s,%s)"
db_cursor.execute(sql,params)

# 提交事务
db_conn.commit()
db_cursor.close()
db_conn.close()
print("数据注册已结束!~~")

==总结:==

(1)当要注册用户时,本质上实现的是()功能;==A、插入数据==;B、查询数据;

(2)注意:使用pymysql模块操作注册功能时,记得进行语句参数化。

掌握登录

==目标:==掌握如何进行登录操作。

当成功注册用户信息后,则可以进行登录操作了。那么,登录是怎么做的呢?

其实,登录账户本质上就是:查询用户数据,并与用户手动输入的用户名和密码进行匹配。

当匹配成功,则可以登录;反之,则登录失败。

例如,一起来完成:

(1)使用键盘录入数据的形式输入用户名、密码,并用于登录操作;

(2)当登录时,使用的数据内容则是已注册成功的用户表信息;

(3)观察注册成功后的用户数据,当已匹配成功,则表示成功登录。

python 复制代码
import pymysql

db_conn = pymysql.connect(
    host="localhost",
    port=3306,
    user="root",
    password="123456",
    database="sz38db_users",
    charset="utf8"
)
db_cursor = db_conn.cursor()
# 执行查询语句、匹配
sql = "select username,password from tb_user"
db_cursor.execute(sql)
query_result = db_cursor.fetchall()
print(query_result)

# 匹配
in_uname = input("请输入用户名:")
in_upwd = input("请输入密码:")
# for user in query_result:
for username,password in query_result:
    if in_uname == username and in_upwd == password:
        print(f"恭喜你,{username}, 已登录成功!!")
        break  # 跳出
else:
    print("登录失败!!!")

# 提交事务
db_conn.commit()
db_cursor.close()
db_conn.close()
print("数据注册已结束!~~")

# 需求:
# 1.根据上述sql无法知道是用户名或密码哪个出错了, 若要知道到底是哪个出错, 做新需求??   select username from tb_user where password=xx;
# 2.注册和登录账户时,应该要给密码加密处理? 做新需求?? -hashlib库   [MD5 =32位]  [SHA1 = 40位]  ==>学习: 是什么? 使用API?  实战开发?
# https://tool.lu/encdec/

# *3.验证码? 邮箱号、手机号等?  --新增字段、添加数据等??

==总结:==

(1)在Python中,如果要判断数据内容是否匹配成功可以使用()语句;==A、if==;B、where;

(2)注意:在实际应用中,登录和注册功能可能还会涉及到用户数据加密,比如MD5加密、SHA1加密等。

相关推荐
AAA@峥1 小时前
系统化学习 MySQL:数据类型、库表管理、增删改查全解析
数据库·学习·mysql
流星白龙8 小时前
【Redis】2.Redis重大版本
数据库·redis·junit
流星白龙8 小时前
【Redis】7.Hash表
数据库·redis·哈希算法
love530love8 小时前
OpenClaw Windows Companion 桌面客户端 连接 LM Studio 完整配置指南
人工智能·windows·python·openclaw
流星白龙9 小时前
【Redis】4.基本全局命令
数据库·redis·缓存
王八八。10 小时前
Navicat 17破解版下载安装教程 附安装激活步骤(2026 最新版)
数据库·navicat
cui_ruicheng10 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
Jelena1577958579211 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
_Jimmy_11 小时前
FastAPI + SQLAlchemy全局事务管理
python·fastapi
用户83562907805112 小时前
如何使用 Python 在 Excel 中添加、编辑和删除超链接
后端·python