数据库介绍
概念
一个存放数据的仓库(Database),这个仓库按照一定的数据结构组织、存放、管理数据。
分类
关系型数据库:mysql、sql server、oracle、DB2等
非关系型数据库:redis等
python操作数据库的方式
pymysql:纯python开发,支持python2和python3,简单易用
数据库基本操作
基本流程:
代码实现步骤
pymysql连接数据库
# 导包
import pymysql
#创建连接
conn = pymysql.connect(host="localhost",
port=3307,
user="root",
password="root",
database="books")
# 获取游标
cursor = conn.cursor()
# 执行sql
cursor.execute("select version()")
result = cursor.fetchall()
print(result)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
运行结果:
pymysql查询操作
此处运用数据库代码如下:
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 '图书名称',
`put_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');
表如图:
查询操作:
"""
1.连接到数据库(host:localhost user:root password:root database:books)
2.查询图书表的数据(包括:图书id、图书名称、阅读量、评论量)
3.获取查询结果的总记录数
4.获取查询结果的第一条数据
5.获取全部的查询结果
"""
import pymysql
# 创建连接
conn = pymysql.connect(host="localhost",
port=3307,
user="root",
password="root",
database="books"
)
# 获取游标
cursor = conn.cursor()
# 执行sql
# 2.查询图书表的数据
sql = "select id, title, `read`, `comment` from t_book;"
cursor.execute(sql)
# 3.获取查询结果的总记录数
print("获取的查询结果记录行数为:", cursor.rowcount)
# # 4.获取查询结果的第一条数据
# print(cursor.fetchone())
# 5.获取全部查询结果
print(cursor.fetchall())
# 关闭游标
cursor.close()
# 关闭连接
运行结果:
上面代码注释掉了4.获取查询结果的第一条数据
当不注释此条语句时运行结果如图:
为什么会发生这种情况?
因为游标。
游标是SQL的一种数据访问机制,游标是一种处理数据的方法。
使用SQL的select查询操作返回的结果是一个包含一行或者是多行的数据集。如果我们要对查询的结果再进行查询,比如(查看结果的第一行、下一行、最后一行、前十行等等操作)简单的通过select语句无法实现,因为此时索要查询的结果不是数据表,而是已经查询出来的结果集。
游标就是针对这种情况而出现的
我们可以将”游标“简单的看成是结果集的一个指针,可以根据需要在结果集上面来回滚动,浏览我们需要的数据。
怎样解决这个问题?
重置游标位置。
"""
1.连接到数据库(host:localhost user:root password:root database:books)
2.查询图书表的数据(包括:图书id、图书名称、阅读量、评论量)
3.获取查询结果的总记录数
4.获取查询结果的第一条数据
5.获取全部的查询结果
"""
import pymysql
# 创建连接
conn = pymysql.connect(host="localhost",
port=3307,
user="root",
password="root",
database="books"
)
# 获取游标
cursor = conn.cursor()
# 执行sql
# 2.查询图书表的数据
sql = "select id, title, `read`, `comment` from t_book;"
cursor.execute(sql)
# 3.获取查询结果的总记录数
print("获取的查询结果记录行数为:", cursor.rowcount)
# 4.获取查询结果的第一条数据
print(cursor.fetchone())
# 5.获取全部查询结果
# 重置游标位置
cursor.rownumber = 0
print(cursor.fetchall())
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
先用print(cursor.rownumber)
查看游标位置
然后重置位置cursor.rownumber = 0
运行结果为:
pymysql插入操作
import pymysql
# 创建连接
conn = pymysql.connect(host="localhost",
port=3307,
user="root",
password="root",
database="books",
autocommit=True
)
# 获取游标
cursor = conn.cursor()
# 执行sql
# 2.新增一条图书数据
sql = "INSERT into t_book(id, title, put_date) VALUES(4, '西游记', '1986-01-01');"
cursor.execute(sql)
# 3.获取受影响的结果记录数
print("获取受影响的结果记录数为:", cursor.rowcount)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
运行结果:
返回数据库查看:
pymysql更新操作
# 导包
import pymysql
# 创建连接
conn = pymysql.connect(host="localhost",
port=3307,
user="root",
password="root",
database="books",
autocommit=True)
# 获取游标
cursor = conn.cursor()
# 执行sql
sql = "UPDATE t_book set title='东游记' WHERE title='西游记';"
cursor.execute(sql)
print(cursor.rowcount)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
运行结果:
返回数据库查看:
pymysql删除操作
# 导包
import pymysql
# 创建连接
conn = pymysql.connect(host="localhost",
port=3307,
user="root",
password="root",
database="books",
autocommit=True)
# 获取游标
cursor = conn.cursor()
# 执行sql
sql = "DELETE from t_book where title ='东游记';"
cursor.execute(sql)
print(cursor.rowcount)
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
运行结果:
返回数据库查看
查询操作与非查询操作的异同点
-
相同点:基本操作流程都一样(创建连接,获取游标,执行sql,关闭游标,关闭连接)
-
不同点
要执行sql语句不一样
非查询操作需要开启事务(在创建连接时,指定参数autocommit=True)