生产实习第五天
MySQL高级
多对多关系表设计
通过设置中间表的方式实现“多对多”关系表的设计,中间表至少有两个外键字段,分别关联于两张“多”表的主键,而且这两个外键字段的组合值不能重复(一种方式是通过将这两个字段设置为联合主键,以确保它们的组合值不重复)。
create database mydb charset=‘utf8’;
use mydb;
create table students(
id int primary key auto_increment,
name varchar(20) not null,
sex varchar(10) not null,
age int
);
insert into students(name,sex,age)values(‘郭靖’,‘男’,20),
(‘黄蓉’,‘女’,18),(‘杨过’,‘男’,22),(‘小龙女’,‘女’,25);
create table subjects(
id int primary key auto_increment,
name varchar(20) not null
);
insert into subjects(name)values(‘英语’),(‘历史’),(‘考古学’);
create table students_subjects(
student_id int not null,
subject_id int not null,
score double not null,
foreign key(student_id) references students(id),
foreign key(subject_id) references subjects(id),
primary key(student_id,subject_id)
);
insert into students_subjects(student_id,subject_id,score)
values(1,2,83),(1,1,60),(2,1,85),(3,1,65),(3,2,70),(3,3,85);
insert into students_subjects(student_id,subject_id,score)
values(3,3,90);
select students.name as 学生姓名,subjects.name as 科目名,students_subjects.score as 成绩
from students
inner join students_subjects on students.id=students_subjects.student_id and students.id=3
inner join subjects on students_subjects.subject_id=subjects.id;
事物及其特性
事务是一系列操作,这些操作组成了一个逻辑工作单元。这个逻辑工作单元中的操作作为一个整体,要么全部成功,要么全部失败。
1.原子性(Atomicity):
事务中的一系列操作作为一个原子性的逻辑工作单元,这个逻辑工作单元中的操作要么全部成功,要么全部失败。
2.一致性(Consistency):
事务操作之前与操作之后数据库系统的数据状态是从一种一致性状态转换到另一种一致性状态。
3.隔离性(Isolation)
多个事务并发执行时,互相不能看到对方的操作过程。
4.持久性(Durability)
一旦事务执行成功,对数据库系统的影响是持久性的。
事物的隔离级别
-
读未提交(read uncommitted)
可能会发生脏读现象(读取了其他事务未提交的数据)、不可重复读、幻读(两次读取的行数不一致)。 -
读提交(read committed)
可能发生不可重复读、幻读(两次读取的行数不一致)。 -
可重读级别(repeatable read)
MySQL默认隔离级别。 -
串行化级别(serializable)
隔离级别最高,甚至针对普通的查询操作都会加锁。
select * from student; 执行该查询会默认加读锁(共享锁)。
(1)、读锁(共享锁):一个事务对某些数据加上了读锁,其他事务对这些数据也可以加读锁;但是其他事务不能对这些数据加写锁。
添加读锁:
select 字段列表 from 表名称 lock in share mode;(select 字段列表 from 表名称"也会自动加读锁。)
(2)、 写锁(排他锁):一个事务一旦对数据加上了写锁,则其他事务既不能对数据加读锁,也不能加写锁。
添加写锁:
update、delete会自动添加写锁。
select 字段列表 from 表名称 for update;
事务常用命令
1.开启事务
begin 或者 start transaction
2.提交事务
commit
3.回滚整个事务
rollback
4.查看当前隔离级别
select @@tx_isolation;
5.设置当前会话(连接)的事务隔离级别:
set session transaction isolation level
read uncommitted | read committed | repetable read | serializable;
异常机制
异常机制是指当程序出现错误后,程序的处理方法。异常机制提供了程序正常退出的安全通道。
常见异常:
ZeroDivisionError : 除数为0异常
FileNotFoundError : 文件未找到异常
TypeError: 类型异常
StopIteration:停止迭代异常
try:
检测范围
except 异常类型[as reason]:
出现异常后的处理代码
[else:]
当try子句中没有发生异常时执行
try:
检测范围
[except异常类型[as reason]:
出现异常后的处理代码]
finally:
无论如何都会被执行的代码
try:
a=int(input("输入一个数字"))
b = int(input("输入一个数字"))
c=a/b
print("和",c)
except ValueError as e:
print("出错",type(e))
except ZeroDivisionError:
print("除数不为0")
except Exception:
print("其他")
finally:
print("依旧运行")
Python操作MySQL
步骤:
(1)、安装Python连接MySQL的驱动库:pip install pymysql
(2)、建立连接:
import pymysql
conn = pymysql.connect(
host="localhost",
port=3306,
user="root",
password="123456",
database="mydb",
charset="utf8"
)
#直接pymysql.connect()亦可
(3)、 创建游标对象,用来执行SQL语句
cursor = conn.cursor()
(4)、使用游标对象执行SQL
cursor.execute(sql语句)
(5)、提交或回滚
conn.commit()、conn.rollback()
(6)、关闭资源
cursor.close()、conn.close()
(7)、执行查询后的数据获取
cursor.fetchone() 返回一个元组,代表查询结果集单条记录的数据
cursor.fetchall() 获取结果集中的所有记录,返回一个元组,元组的每个元素又是一个元组,代表查询结果集的每条记录
cursor.fetchmany(size) 获取结果集中最多size条记录,
以一个元组的形式返回,元组的每个元素又是一个元组,代表记录
import pymysql
conn = pymysql.connect(
host="localhost",
port=3306,
user="root",
password="123456",
database="mydb",
charset="utf8"
)
try:
cursor = conn.cursor()
sql = "select name,sex from students where id={}".format(2) cursor.execute(sql)
item = cursor.fetchone()
print("返回的item的类型:",type(item),"item是:",item)
print("学生姓名:",item[0])
print("学生性别:",item[1])
conn.commit()
print("数据查询成功!")
except Exception as e:
print("操作数据库发生异常啦,异常原因:",e)
conn.rollback()
finally:
cursor.close()
conn.close()
import pymysql
conn = pymysql.connect(
host="localhost",
port=3306,
user="root",
password="123456",
database="mydb",
charset="utf8"
)
try:
cursor = conn.cursor()
sql = "select name,sex from students"
cursor.execute(sql)
items = cursor.fetchall()
print("返回的item的类型:",type(items),"items是:",items)
for item in items:
print("学生姓名:",item[0])
print("学生性别:",item[1])
conn.commit()
print("数据查询成功!")
except Exception as e:
print("操作数据库发生异常啦,异常原因:",e)
conn.rollback()
finally:
cursor.close()
conn.close()
import pymysql
conn = pymysql.connect(
host="localhost",
port=3306,
user="root",
password="123456",
database="mydb",
charset="utf8"
)
try:
cursor = conn.cursor()
sql = "select name,sex from students"
cursor.execute(sql)
items = cursor.fetchmany(3)
print("返回的item的类型:",type(items),"items是:",items)
for item in items:
print("学生姓名:",item[0])
print("学生性别:",item[1])
conn.commit()
print("数据查询成功!")
except Exception as e:
print("操作数据库发生异常啦,异常原因:",e)
conn.rollback()
finally:
cursor.close()
conn.close()