Python -4

本文介绍了如何在MySQL中通过中间表实现多对多关系,展示了创建数据库、表及插入数据的过程。此外,详细阐述了事务的四大特性,并解释了不同隔离级别的含义。最后,探讨了Python操作MySQL的步骤,包括异常处理和数据查询。
摘要由CSDN通过智能技术生成

生产实习第五天

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)
一旦事务执行成功,对数据库系统的影响是持久性的。

事物的隔离级别

  1. 读未提交(read uncommitted)
    可能会发生脏读现象(读取了其他事务未提交的数据)、不可重复读、幻读(两次读取的行数不一致)。

  2. 读提交(read committed)
    可能发生不可重复读、幻读(两次读取的行数不一致)。

  3. 可重读级别(repeatable read)
    MySQL默认隔离级别。

  4. 串行化级别(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() 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值