内容正文:
任务8.2 MySQL数据库操作
学生信息管理系统设计
同学们,大家好,欢迎大家来到本课程第8章的学习。在学习开始前,我们先对这章的学习内容给大家作一个简要的介绍。
1
任务8.2 MySQL数据库操作
【任务描述】
除了SQLite数据库,还可以采用MySQL数据库作为后台数据库来实现学生信息管理系统,通过Python连接MySQL数据库,实现学生信息的存储、读取、查找、修改等功能。
任务8.2 MySQL数据库操作
【任务分析】
要想用MySQL数据库来进行数据的存储和管理,就要先实现对MySQL数据库的访问,整体上来说和上节内容一致,但在MySQL数据库的安装、Python访问方式等细节上有一些不同,需要进行必要的调整。
8.2.2 MySQL数据库的操作
同学们,大家好,欢迎大家来到本课程第8章的学习。在学习开始前,我们先对这章的学习内容给大家作一个简要的介绍。
4
8.2.2 MySQL数据库的操作
属性/方法 说明
close() 关闭数据库连接。
commit() 提交数据库事务。
cursor() 获得游标对象。
rollback() 回滚当前数据数据库事务。
pymysql库为Connection对象提供了一些实现了数据库操作的常用方法,如下表所示:
通过连接对象可以关闭数据库连接,除此以外,通过连接对象的方法,实现对数据库的多种操作。如提交数据库事务、获得游标对象、回滚当前数据库事务。
5
游标对象
与SQLite3一样,pymysql也提供了游标对象(Cursor),负责暂时保存SQL操作所影响到的数据。游标对象通过数据库的连接对象的cursor()方法创建,方法如下:
cur = conn.cursor()
其中,conn为数据库连接对象变量,cur则为游标对象变量。
8.2.2 MySQL数据库的操作
pymysql的游标对象的创建和使用与sqlite3中相同。
8.2.2 MySQL数据库的操作
属性/方法 说明
connection() 获取当前连接对象
close() 关闭游标
execute(sql[,parameters]) 执行SQL语句,返回受影响的行数。sql是SQL语句,parameters是为sql提供的参数
fetchone() 以元组形式返回一条记录,如果没有结果 则返回 None。
fetchall() 执行SQL查询语句,返回元组序列,即返回查询到的所有记录,如果没有结果则返回 ()
游标Cursor对象有很多的属性和方法,其中常用的属性和方法如下:
通过游标对象的方法,python能够实现执行sql语句,获取查询结果等操作。使用方法与sqlite3中相同。
7
编写程序:连接mysql创建数据库dbstu和表tbstu。
1.创建数据库和数据表
【例8-9】创建数据库和数据表。
import pymysql
conn = pymysql.connect(host='localhost',user='user',password='123456',charset= 'utf8')
cur = conn.cursor()
sql_createdb ='create database if not exists dbstu'
cur.execute('use dbstu')
sql_createtb = '''
create table if not exists tbstu(
stuNo varchar(10) primary key,
stuName varchar(4),
gender varchar(1),
age int(3)
)'
cur.execute(sql_createdb)
cur.execute(sql_createtb)
conn.commit()
cur.close()
conn.close()
8.2.2 MySQL数据库的操作
1.创建数据库和数据表
编写程序:连接mysql创建数据库dbstu和表tbstu。
【例8-9】创建数据库和数据表。
import pymysql
conn = pymysql.connect(host='localhost',user='user',password='123456',charset= 'utf8')
cur = conn.cursor()
sql_createdb ='create database if not exists dbstu'
cur.execute('use dbstu')
8.2.2 MySQL数据库的操作
sql_createtb = '''
create table if not exists tbstu(
stuNo varchar(10) primary key,
stuName varchar(4),
gender varchar(1),
age int(3)) '''
cur.execute(sql_createdb)
cur.execute(sql_createtb)
conn.commit()
cur.close()
conn.close()
8.2.2 MySQL数据库的操作
2.数据库异常处理
在编写Python程序对数据库进行操作时,难免会出现一些错误或异常,导致程序终止。为保持数据的一致性,可采用Python的异常处理语句和数据库回滚(rollback)操作,其语法格式如下:
try:
…
except:
conn.rollback()
8.2.2 MySQL数据库的操作
首先执行try子句,如果没有异常发生则忽略except子句,在执行try子句之后结束程序;如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。然后执行except子句部分的数据回滚操作,使在该语句中被修改的数据都能被还原。
【例8-10】数据库异常处理。
import pymysql
conn = pymysql.connect(host='localhost', user='user',password='123456',charset= 'utf8')
cur = conn.cursor()
sql_createdb ='create database if not exists dbstu'
# 切换到dbstu数据库
cur.execute('use dbstu')
8.2.2 MySQL数据库的操作
sql_createtb = '''
create table if not exists tbstu(
stuNo varchar(10) primary key,
stuName varchar(4),
gender varchar(1),
age int(3)
)
try:
cur.execute(sql_createdb)
cur.execute(sql_createtb)
conn.commit() # 事务提交
except:
conn.rollback() # 事务回滚
cur.close()
conn.close()
8.2.2 MySQL数据库的操作
sql_createtb = '''
create table if not exists tbstu(
stuNo varchar(10) primary key,
stuName varchar(4),
gender varchar(1),
age int(3)
)
try:
cur.execute(sql_createdb)
cur.execute(sql_createtb)
conn.commit() # 事务提交
except:
conn.rollback() # 事务回滚
cur.close()
conn.close()
3.数据库的基本操作
在Python程序中对MySQL数据库中的数据进行增、删、改、查等操作,与8.1.2节中SQLite数据库的操作基本一致,要注意MySQL与SQLite3的不同,MySQL使用的占位符为“%s”。
8.2.2 MySQL数据库的操作
【例8-11】向表中插入数据。
import pymysql
# 在创建数据库对象时,通过”db=’dbstu’”指定连接的数据库名
conn = pymysql.connect(host='localhost', user='user', password='123456',\
db=’dbstu’,charset='utf8')
cur = conn.cursor()
8.2.2 MySQL数据库的操作
sql_insert = '''
insert into tbstu values\
('20201001','钱梅宝','男',20),\
('20201002','张平光','男',22),\
('20201003','许动明','男',19),\
('20201004','张 云','女',19),\
('20201005','唐 琳','女',20);
try:
cur.execute(sql_insert)
conn.commit()
except:
conn.rollback()
cur.close()
conn.close()
【例8-12】应用【例8-11】中的数据库和表,编写程序,根据用户输入的学号或姓名查询数据表记录,实现交互式查询。。
import pymysql
conn = pymysql.connect(host='localhost',user='user',password='123456',\
db='dbstu',charset='utf8')
cur = conn.cursor()
while True:
mode = input("请选择查询模式(1、按学号查询,2、按姓名查询):")
if mode =="1":
srhNo = input('请输入要查询的学生学号:')
sql_search = 'select * from tbstu where stuNo=%s;' # %s为占位符
cur.execute(sql_search,srhNo)
8.2.2 MySQL数据库的操作
elif mode =="2":
srhName = input('请输入要查询的学生姓名:')
sql_search = 'select * from tbstu where stuName=%s;'
cur.execute(sql_search,srhName)
else:
print("输入错误,请重新输入。")
continue
rows = cur.fetchall()
print("查询信息如下:")
print("学号\t\t姓名\t性别\t年龄")
8.2.2 MySQL数据库的操作
for row in rows:
print("%s\t%s\t%s\t%s"%(row[0], row[1],row[2],row[3]))
key = input('按“Y”键继续,其他键退出。')
if key.upper() == 'Y':
continue
else:
print('谢谢使用!')
break
bcur.close()
conn.close()
$$