pymysql_python操作MySQL数据库


1 数据的介绍

  • 概念:数据库是一个用来存放数据的仓库,是按照一定的数据结构来存储、组织和管理数据。

  • 分类方法:

    • 关系型数据库:Mysql(开源),Oracle(收费,银行使用),SQL Server(收费),SQLite等

    • 非关系型数据库:redis,mongodb等

 

  • Python操作Mysql数据库的几种方式

    • MysqlDB

      是早期python2.x时代所使用工具,但是由于现在已经进入python3.x时代,已经不再使用这个工具了。

    • mysqlclient

      是mysqldb衍生版本,完全兼容mysqldb。

      是django框架的orm映射工具

    • pymysql

      是纯python实现的驱动,也兼容mysqldb

      也是我们重点学习的工具

    • sqlalchemy

      是即支持原生SQL,也支持ORM的工具,类似于java的hibernate

 

2 数据库的基本操作

 

1 pymysql的安装

  • 在线安装:打开cmd输入命令pip install pymysql

2 pymysql操作数据库的流程

流程图:

 

 

 

流程的文字描述:

1 导包

2 建立连接

3 获取游标

4 执行SQL语句

5 关闭游标

6 关闭连接

 

 

3 案例数据准备

先启动数据库,我们使用phpstudy来启动

如下图所示,如果Mysql右边的绿点是绿色的,那么就证明mysql启动了

连接到数据库

通过navicat工具来连接数据库

打开navicat,然后新建连接

确认测试连接成功后,点击确定(不是测试连接成功的确定,而是建立连接的确定)

连接到数据库

然后打开数据库,点击顶部查询

然后点击下面的新建查询

 

检查有没有运行成功的方式:

先关闭当前的数据库连接,然后重新连接到数据库

下面是sql语句:

CREATE DATABASE IF NOT EXISTS books default charset utf8;
USE books;
DROP TABLE IF EXISTS `t_book`;
CREATE TABLE `t_book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(20) NOT NULL COMMENT '图书名称',
`pub_date` date NOT NULL COMMENT '发布日期',
`read` int(11) NOT NULL DEFAULT '0' COMMENT '阅读量',
`comment` int(11) NOT NULL DEFAULT '0' COMMENT '评论量',
`is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='图书表';
INSERT INTO `t_book` VALUES ('1', '射雕英雄传', '1980-05-01', '12', '34', '0');
INSERT INTO `t_book` VALUES ('2', '天龙八部', '1986-07-24', '36', '40', '0');
INSERT INTO `t_book` VALUES ('3', '笑傲江湖', '1995-12-24', '20', '80', '0');
DROP TABLE IF EXISTS `t_hero`;
CREATE TABLE `t_hero` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '姓名',
`gender` smallint(6) NOT NULL COMMENT '性别',
`description` varchar(200) DEFAULT NULL COMMENT '描述',
`is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除',
`book_id` int(11) NOT NULL COMMENT '所属图书ID',
PRIMARY KEY (`id`),
KEY `t_hero_book_id` (`book_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='英雄人物表';
INSERT INTO `t_hero` VALUES ('1', '郭靖', '1', '降龙十八掌', '0', '1');
INSERT INTO `t_hero` VALUES ('2', '黄蓉', '0', '打狗棍法', '0', '1');
INSERT INTO `t_hero` VALUES ('3', '乔峰', '1', '降龙十八掌', '0', '2');
INSERT INTO `t_hero` VALUES ('4', '令狐冲', '1', '独孤九剑', '0', '3');
INSERT INTO `t_hero` VALUES ('5', '任盈盈', '0', '弹琴', '0', '3');

 

 

 

4 数据库基本操作

  • 连接数据库示例代码

# 1 导包
# 注意如果导入的pymysql是黄色的,那么有可能你的项目名称和python文件名称是pymysql导致导包导入错误
# 如果是一个波浪线,有可能没有选择运行环境和没有安装pymysql
import pymysql
# 2 建立连接
conn = pymysql.connect(host='localhost', user='root', password='root', port=3306)
# 3 获取游标
cursor = conn.cursor()
# 4 执行SQL语句:执行查询数据库版本的SQL语句
# 注意SQL语句当中的符号都必须是英文的符号
cursor.execute("select version();")
# 打印执行的结果
# 获取执行结果
result = cursor.fetchone()
# 打印查询结果
print("result=", result)
# 5 关闭游标
cursor.close()
# 6 关闭连接
conn.close()
  • 数据库查询操作代码

# 1 导包
import pymysql
# 2 建立连接:连接到数据库(host:localhost username:root password:root database:books)
conn = pymysql.connect(host='localhost', user='root', password='root', database='books')
# 3 获取游标
curcor = conn.cursor()
# 4 执行SQL语句:
# 查询图书表的数据(包括:图书id、图书名称、阅读量、评论量)
curcor.execute("select id,title,`read`,`comment` from t_book;")
# 获取查询结果的总记录数:curcor.rowcount的意思是获取执行SQL语句之后影响的行数
print("总记录数:", curcor.rowcount)
# 获取查询结果的第一条数据
print("第一条数据:", curcor.fetchone())
# 获取全部的查询结果
# 注意:如果在上面先运行的cursor.fetchone()那么,数据的指针会下移,导致cursor.fetchall()获取的数据
# 会缺少一行。要解决这个问题,需要重置指针。
print("执行了fetchone后的全部的查询结果:", curcor.fetchall())
# 重置指针的方法:重新执行查询语句
curcor.execute("select id,title,`read`,`comment` from t_book;")
# 重新之后再打印执行结果
book_list = curcor.fetchall()
print("重置指针之后的全部结果:", book_list)
# 遍历book_list,打印所有的书
for book in book_list:
   print("书:", book[1])
# 5 关闭游标
curcor.close()
# 6 关闭连接
conn.close()
  • 插入语句

# 1 导包
import pymysql
# 2 建立连接
conn = pymysql.connect(host='localhost',
                      user='root',
                      password='root',
                      database='books',
                      autocommit=True)
# 3 获取游标
cursor = conn.cursor()
# 4 执行SQL语句:执行插入一本的SQL语句
cursor.execute('insert into t_book(id, title, pub_date) values(4, "周易", "1986-01-01");')
# 查看执行结果
cursor.execute('select * from t_book;')
print("插入结果为:", cursor.fetchall())
# 5 关闭游标
cursor.close()
# 6 关闭连接
conn.close()
  • 修改语句

# 导包
import pymysql
# 建立连接
conn = pymysql.connect(host='localhost', user='root', password='root', database='books', autocommit=True)
# 获取游标
cursor = conn.cursor()
# 执行update语句:对周易这本书的阅读量自增1操作
update_sql = "update t_book set `read`=`read`+1 where title='周易';"
cursor.execute(update_sql)
# 查询周易这本书的阅读量有没有自增1
cursor.execute("select * from t_book where id =4;")
print("周易这本书:", cursor.fetchall())
# 关闭游标
cursor.close()
# 关闭连接
conn.close()

 

  • 删除语句

# 导包
import pymysql
# 建立连接
conn = pymysql.connect(host='localhost', user='root', password='root', database='books',autocommit=True)
# 获取游标
cursor = conn.cursor()

# 删除前的结果:
# 查看执行结果
cursor.execute("select * from t_book;")
print("删除前的结果为:", cursor.fetchall())

# 执行删除语句delete from t_book where id=4;
cursor.execute('delete from t_book where id=4;')
# 删除后执行结果

cursor.execute("select * from t_book;")
print("删除后的结果为:", cursor.fetchall())

# 关闭游标
cursor.close()
# 关闭连接
conn.close()

 

5 数据库事务的概念

  • 概念:事务是一组操作序列,这组操作序列,要么全部都成功,要么全部都失败。

    举个例子:银行转账的过程当中,所有的操作都要认为是一个事务,如果中间有一个操作失败,那么之前成功操作都要回滚,(按照日志记录回滚),保证操作没有发生,还原原始的场景。

 

 

  • 事务的特性(面试时偶尔会被问到)和作用

    • 原子性:事务就像原子一样不可分隔,事务的操作,要么完全的执行,要么完全的不执行。

    • 一致性:是指提交事务前,数据都没有改变,提交事务后,数据统一发生改变

    • 隔离性:是指事务与事务之间,事务的中间状态不对其他事务可见。

      • mysql数据库如果是innodb引擎,那么他是基于事务来进行的操作,每一个连接都可以认为有事务在其中参与。

    • 持久性:一旦提交事务成功之后,那么就会永久的修改数据库中的数据,不会因为外部因素而发生改变,例如断电不会影响数据。

    • 作用:适用于一些要保证所有操作全部成功或全部失败业务。(银行转账案例)

  • 操作事务的几种方式:

    • 自动提交事务的开关

      1 建立连接时,通过连接中autocommit=True来开启自动提交事务,默认是不开启

      2 建立连接之后,通过conn.autocommit(True)来开启自动提交事务

    • 手动提交事务和手动回滚事务

      提交事务:conn.commit()

      回滚:conn.rollback()

 

数据库事务没有提交和提交的案例案例演示:

# 1 导包
import pymysql

# 2 建立连接:为了演示手动提交事务,自动提交事务的开关需要使用的默认的false
conn = pymysql.connect(host='localhost', user='root', password='root', database='books', port=3306)
# 3 获取游标
cursor = conn.cursor()
# 4 执行
# 需求:先新增一本书(t_book),然后再新增一个英雄人物(t_hero)
# 先新增一本书
cursor.execute('insert into t_book(id, title, pub_date) values(4,"本草纲目", "1980-01-01")')
# 再新增一个英雄人物
cursor.execute('insert into t_hero(id, gender,`name`, description, book_id) values(6,1, "李时珍", "医学宝典", 4);')
# 最后查询新增的书和人物
cursor.execute("select * from t_book where id=4;")
print("新增书为:", cursor.fetchall())
cursor.execute("select * from t_hero where id=6")
print("新增的人物为:", cursor.fetchall())
# 注意:如果没有编写提交事务的代码,那么我们在代码中插入的数据都不会生效,只会在当前的代码的事务当中生效
# 如果想要在navicat当中查看到执行结果,我们需要手动提交事务(前提是自动提交事务的开关是false)
# 提交事务的代码为:conn.commit()
conn.commit()
# 5 关闭游标
cursor.close()
# 6 关闭连接
conn.close()

 

回滚代码案例

# 导包
import pymysql
# 建立连接
conn = pymysql.connect(host='localhost', user='root', password='root', database='books')
# 获取游标
cursor = conn.cursor()
# 执行SQL语句

#新增一条图书数据(id:4 title:西游记 pub_date:1986-01-01 )
#新增一条英雄人物数据(name:孙悟空 gender:1 book_id:4)


cursor.execute("insert into t_book(id, title, pub_date) values(6, '创新公司:皮克斯的启示', '1970-01-01');")
cursor.execute("insert into t_hero(`name`, gender, book_id) values('乔布斯',1, 6);")

# 回滚事务的意思是:把当前事务中进行所有操作都撤销。
# 为了演示回滚,首先在代码中插入数据库成功之后,查询一次,理论上应该能够查询到我们插入的创新公司和乔布斯
cursor.execute("select * from t_book;")
print("查看当前代码中的事务中,创新公司是否存在:", cursor.fetchall())
cursor.execute("select * from t_hero;")
print("查询当前代码中的事务中,乔布斯是否存在:", cursor.fetchall())
# 然后回滚后,由于当前的数据会被撤销,所以再次查询时,会查不到创新公司和乔布斯
conn.rollback()
# 回滚后再打印结果
cursor.execute("select * from t_book;")
print("查看回滚后当前代码中的事务中,创新公司是否存在:", cursor.fetchall())
cursor.execute("select * from t_hero;")
print("查看回滚后当前代码中的事务中,乔布斯是否存在:", cursor.fetchall())
# 关闭游标
cursor.close()
# 关闭连接
conn.close()

 

演示事务全部成功和全部失败

在下面这个案例中,try语句中没有出现异常,就会全部成功;如果出现了异常,就会全部回滚

# 导包
import pymysql
conn,cursor=None,None
try:
   # 建立连接
   conn = pymysql.connect(host='localhost', user='root', password='root', database='books')
   # 获取游标
   cursor = conn.cursor()
   # 执行SQL语句

   # 需求:展示所有操作全部成功时,应该自动提交事务和操作中有一个事务失败时,自动回滚事务
   #新增一条图书数据(id:4 title:西游记 pub_date:1986-01-01
   #新增一条英雄人物数据(name:孙悟空 gender:1 book_id:4
   print("Test--------------1")
   cursor.execute("insert into t_book(id, title, pub_date) values(7,'创新公司:皮克斯的启示222', '1970-01-01');")
   cursor.execute("insert into t_hero(`name`, gender, book_id) values('乔布斯2',1, 6);")
   print("Test--------------2")
   # 回滚事务的意思是:把当前事务中进行所有操作都撤销。
   # 为了演示回滚,首先在代码中插入数据库成功之后,查询一次,理论上应该能够查询到我们插入的创新公司和乔布斯
   cursor.execute("select * from t_book;")
   print("查看当前代码中的事务中,创新公司是否存在:", cursor.fetchall())
   cursor.execute("select * from t_hero;")
   print("查询当前代码中的事务中,乔布斯是否存在:", cursor.fetchall())
   print("Test--------------3")

   # 这是主动加上的异常语句,如果要演示提交成功,可以把异常语句注释掉
   # 如果是不注释:就是回滚
   # 注释:就是提交操作
   raise Exception("主动抛出的异常")
   # 提交事务
   conn.commit()

except Exception as e:
   print(e)
   # 然后回滚后,由于当前的数据会被撤销,所以再次查询时,会查不到创新公司和乔布斯
   if conn:
       conn.rollback()
   # 回滚后再打印结果
   if cursor:
       cursor.execute("select * from t_book;")
       print("查看回滚后当前代码中的事务中,创新公司是否存在:", cursor.fetchall())
   if cursor:
       cursor.execute("select * from t_hero;")
       print("查看回滚后当前代码中的事务中,乔布斯是否存在:", cursor.fetchall())
finally:
   if cursor:
       # 关闭游标
       cursor.close()
   if conn:
       # 关闭连接
       conn.close()

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM