第四章:MySQL(后篇)

第一节:可视化图形客户端

为了对数据库的操作更为直观,更方便。MySQL有一些图形界面客户端,方便了我们的使用,无论从视觉还是操作上用户体验都非常好。如:Navicat Premium、海豚SQLYog、PyCharm等。这些客户端都能操作MySQL,而且各有各自的优点,以下简单地以海豚SQLYog和PyCharm作为介绍和操作

海豚SQLYog客户端

官网下载

自行到SQLYog官网下载即可
下载链接可以点击此处:

连接客户端

在这里插入图片描述

操作数据

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

PyCharm图形客户端

使用pycham连接mySQL需要注意的是,如是是社区版的pycham,可能有的版本会出现没有自带database功能的情况。以下按照自身情况进行操作

自带database的操作

pycham是否自带了database,很容易判别,打开view>勾上Tool Buttons,然后界面右上角便有database。(如果没有,以下操作忽略)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

插件版database的操作

如果打开view>勾上Tool Buttons,然后界面右上角仍然没有database,可见Pycham并没有自带。需要自行下载插件。可在设置里进行搜索后下载。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

扫描二维码关注公众号,回复: 4926770 查看本文章

第二节:Python与MySQL的交互

对数据库的操作不能是手动的,比如当我们制作成APP给用户使用的时候,应该给用户动态地进行增、删、改、查。这时需要编程语言,使用代码对数据库进行操作,这便需要python与MySQL进行交互
Python与MySQL数据库之间的交互,需要借助于第三方类库pymysql进行实现;

pymysql的安装

pip3 install pymysql

Python与MySQL的交互交互过程

1、配置和连接数据库;
pymysql.connect(host,port,user,password,database,charset)
2、获取数据查询游标,以执行SQL语句;
corsor = conn.cursor()
3、执行SQL语句,返回受影响的记录数;
affected = ursor.execute(sql)
4、如果是查询,从游标中读取得到的结果;
cursor.fetchall()
5、提交本次访问的结果;
conn.commit()
6、关闭数据库;
conn.close()

例:

import pymysql

# 连接数据库
import pymysql

conn = pymysql.connect(
    # IP和端口
    host="127.0.0.1", port=3306,
    # 账号和密码
    user="root", password="xxxxxx",
    # 数据库和编码
    database="wulin", charset="utf8"
)

# 获得数据库游标
cursor = conn.cursor()

# 执行插入,返回受影响的行数
affected = cursor.execute("insert into students(name,gender) values ('%s','%s')" % ('老顽童','男'))
print("插入结束,%d条记录受影响" % (affected))

# 执行查询,返回受影响的行数
affected = cursor.execute("select * from students")
print("查询到%d条记录" % (affected))

# 查询的结果是被保存在游标中的,拿取全部结果
ret = cursor.fetchall()
print(type(ret))  # 类型是二维元组
for i in ret:
    print(i)

# 提交当前事务到数据库,不提交等于啥也没干
conn.commit()
print("修改已提交")

# 断开数据库连接(io操作,浪费资源)
conn.close()

注意事项:在写SQL语句时,字符串类型的值必须【显式地】包裹在引号内,这是SQL的语法!
执行结果:
在这里插入图片描述

数据库事务

当我们对数据库进行批量操作时,这一系列操作往往是一个有机整体;
因此这一系列操作,应该要么全部成功,要么全部回滚到访问前的状态,否则就容易形成脏数据;
举个例子,一次网购交易的成功提交,要修改商家出货表、用户订单表、转账信息表、物流信息表等等,所有环节都必须严丝合缝,发生任何异常交易都不应成功,一切数据应回滚到交易发生前的状态;
这种要么全部成功、要么全部失败且数据回滚的批量数据操作,就称为一次事务(Transaction);
一次事务(批量数据操作)的结果只有两种:
①全部成功并提交,
②发生异常并回滚;conn.rollback()

例:

import pymysql

# 连接数据库
conn = pymysql.connect(
    host="127.0.0.1", port=3306,
    user="root", password="xxxxxx",
    database="wulin", charset="utf8"
)

try:
    # 获得数据库游标
    cursor = conn.cursor()

    # 执行修改,返回受影响的行数
    affected = cursor.execute("update students set name='%s' where name='%s'" % ("欧阳疯","老顽童"))
    print("修改结束,%d条记录受影响" % (affected))

    # 执行删除,返回受影响的行数(故意把下面的students写成student)
    affected = cursor.execute("delete from student where name = '欧阳疯'")
    print("删除结束,%d条记录受影响" % (affected))

    # 提交当前事务到数据库,不提交等于啥也没干
    conn.commit()
    print("事务已提交")

except Exception as e:
    # 发生异常时回滚到整个事务开始之前的状态
    conn.rollback()
    print(e, "操作错误,数据已回滚")

# 断开数据库连接
conn.close()

执行结果:
在这里插入图片描述

事务的四大特性(ACID)

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。

【原子性】
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

【一致性】
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。其主要特征是保护性和不变性

【隔离性】
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

【持久性】
在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

事务隔离级别

数据库是要被广大客户所共享访问的,那么在数据库操作过程中很可能出现以下几种不确定情况

【脏读】
一个事务读取到了另一个事务未提交的数据操作结果。这是相当危险的,因为很可能所有的操作都被回滚。

【不可重复读】
不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。包括以下情况:
(1) 虚读:事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。
(2) 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。

【更新丢失】
两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。

在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。

【未授权读取】
也称为读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

【授权读取】
也称为读提交(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

【可重复读取】
可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻读数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

【序列化读取】
序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,但也是个别特殊场合

编辑隔离级别
  • 方式一:使用命令编辑
功能 命令
查看当前事务隔离级别 select @@tx_isolation
查看全局所有数据库隔离级别 select @@global.tx_isolation
设置当前事务隔离级别 set tx_isolation='READ-COMMITTED'
设置全局所有数据库隔离级别 set global tx_isolation='REPEATABLE-READ'

例:
在这里插入图片描述

  • 方式二:修改数据库的全局配置文件

除了可以使用命令行操作执行对数据库隔离级别的修改外,还可以在数据库的全局配置文件 my.ini 中的**mysqld** 选项进行编缉修改。修改后记得重启服务方能生效。
my.ini位置可在mysql服务程序的属性配置中查询。
【TIPS】
我们在电脑中的mysql之所以能简单的使用,是因为mysql的服务程序mysqld早就在电脑开机启动时在后台自动开始运行的关系。它不是一个可执行程序,而是系统可自行启动的mysql服务。其中,它的路径所指向的默认文件--defaults-file,便是数据库的全局配置文件**my.ini**

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xiangchi7/article/details/85085392