1.定义:

当查询的复杂度很高时,指多字段,多关系查询,会导致sql语句混乱,不利于sql语句的编写和编写的sql语句的可读性,引入了视图

视图是一张虚拟的表,有字段和数据,只存放查询语句

视图有字段有行,但是视图基于源表

2.特点:

视图的优点

1.简单:
视图构建了一个虚拟的表,表里的数据是来源于复杂的查询语句,我们将复杂的查询语句存入视图,使用时直接调用视图

2.安全:
数据库有对库和表的权限管理,但是没有对字段权限,可以通过视图来实现权限的功能

3.数据的独立性:
视图基于源表,当源表的结构发生变化时,不会对视图产生影响

视图的缺点

1.降低查询效率

使用视图时,一般存的都是复杂的查询,如果存的是简单的查询,在使用视图时,会作为复杂查询来去执行,会降低查询效率

2.会增加数据库的维护和管理成本,会对数据迁移造成很大影响

3.视图的操作

CREATE VIEW 视图名 AS(查询语句);
SHOW TABLE STATUS WHERE COMMENT=’view’;
SELECT * FROM 视图名;

DROP VIEW 视图名;
在这里插入图片描述
查看是否删除成功
在这里插入图片描述

向源表插入数据,源表中有数据,视图也可以看见,但添加字段,不会对视图产生影响

在这里插入图片描述
视图中同样可以看见
在这里插入图片描述
添加字段源表可以看到
在这里插入图片描述
但视图却没有
在这里插入图片描述

二、触发器 Trigger

1.定义及触发条件:

定义:
触发器是一个特殊的存储过程,不需要手动触发,也不用需要call语句调用

触发条件:
由事件触发,当我们在做 添加 删除 修改操作时会自动触发触发器

注意:在创建触发器之前要修改数据的默认结束符 ;创建完触发器记得把结束符改回来

修改方式: \d 修改后的结束符

2.触发器的操作

创建触发器

CREATE TRIGGER 
触发器名字 触发时机 触发事件 
ON 表名 
FOR EACH ROW 
BEGIN
触发器要执行的sql语句

给user表创建一个触发器,当向user表中添加数据时 给userinfo也添加一条数据

创建一个userinfo表
在这里插入图片描述
创建一个触发器
在这里插入图片描述

使用触发器

在创建触发器条件触发成功就执行对应操作;
如下面语句插入成功
在这里插入图片描述

查看触发器

Select * from information_schema.triggers;

删除触发器

Drop trigger 触发器名字

在这里插入图片描述
查看是否删除成功
在这里插入图片描述

在创建触发器前要创建一个和源表表格式相同的表back_user

备份的数据一定要放在格式相同的表中不然报错
在这里插入图片描述
当我们删除user表中的数据时 将删除的数据备份的 back_user表中

代码如下:

Create trigger back_user before delete on user for each row
Begin
Insert into back_user values(old.id,old.uname);

三、事物的基本操作

注意在进行操作时要开启两个命令行进行操作(因为操作后的结果可能在一个命令行中无法出现有效结果)

1.Begin 开启一个事物

开启事务后未提交的影响:
在这里插入图片描述

2.Commit 提交事物

提交后: 数据正常显示
在这里插入图片描述

3.Rollback 回滚

在提交以后执行回滚: 无效果
在这里插入图片描述
在提交前执行回滚 撤销操作

四、使用python连接数据库

1.Pymysql

pymysql的使用要求

Pymysql:是一个第三方的模块,并且要求你的python版本为3.5以上
Python2中使用的是 mysqldb

安装: pip install pymysql

1.连接数据库
2.创建游标
3.定义sql语句
4.执行sql语句
5.关闭连接

代码如下:

import pymysql #1.连接数据库 db=pymysql.connect(host='localhost',user='root',password='123456',database='demo', cursorclass=pymysql.cursors.DictCursor) # 2.创建游标对象 cursor=db.cursor() # 3.定义查询的sql语句 # sql='select * from student' # sql='insert into student(id,name,age) values(11,"甄姬",16)' # sql='update student set name="周瑜" where name="甄姬"' sql="delete from student where name='周瑜'" # 4.执行sql语句 cursor.execute(sql) # 获取返回的结果 # 获取一条 print(cursor.fetchone()) # 获取全部 print(cursor.fetchall()) # 属性,返回操作条数 # print(cursor.rowcount) # 如果操作对数据库中的数据产生了影响必须提交 db.commit() # 5.断开连接 cursor.close() db.close()

查询
在这里插入图片描述

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

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

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

封装成类,用的时候直接实例化对象调用函数

import pymysql
class MyDB:
    def __init__(self):
        # 连接数据库,创建游标对象
        self.db=pymysql.connect(host='localhost',user='root',password='123456',database='demo', cursorclass=pymysql.cursors.DictCursor)
# 传参数的写法
    # self.db = pymysql.connect(host=h, user=u, password=p, database=db,                    cursorclass=pymysql.cursors.DictCursor)
    self.cursor=self.db.cursor()
# 做查询
def query(self,sql):
    self.cursor.execute(sql)
    return self.cursor.fetchall()
# 做添加 删除 修改
def change(self,sql):
    self.cursor.execute(sql)
    self.db.commit()
    return self.cursor.rowcount
# 析构函数
def __del__(self):
    # 关闭数据库连接
    self.cursor.close()
    self.db.close()
# 测试是否能正常使用
if __name__ == '__main__':
    # 实例化
    database=MyDB()
    res=database.query(sql='select * from student')
    print(res)

运行成功
在这里插入图片描述
在别的py文件里实例化对象进行操作

from mydb import MyDB
# 实例化数据化对象
database=MyDB()
# 插入数据
sql='insert into student(id,name) values(10,"韩信")'
print(database.change(sql))
# 定义sql语句
# sql='select * from student'
# print(database.query(sql))

获取返回内容的方法

fetchone() 获取一条数据
Fetchall() 获取返回的所有的数据 
Rowcount  属性 获取操作影响的行数

2.orm操作

orm数据映射关系

将python语句转义成sql语句和数据库进行交互

1.使用方便

2.执行效率下降

python 的 orm sqlalchemy

在这之前要安装mysqlclient
然后sqlalchemy创建连接是不需要+pymysql,否则都要加;

创建连接
数据库类型+数据库操作的包:// 用户名:密码@主机地址/你要操作的数据库

import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
# 类似于 pymysql中的游标
from sqlalchemy.orm import sessionmaker
# 1.创建连接
# 数据库类型:// 用户名:密码@主机地址/你要操作的数据库
# mysql://scott:tiger@hostname/dbname
db = sqlalchemy.create_engine('mysql://root:123123@localhost/sqlorm')
# 2.创建基类
base = declarative_base(db)
# 3.创建类 必须继承基类  创建模型
class User(base):
    __tablename__='user'
    id = sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
    name = sqlalchemy.Column(sqlalchemy.String(32)) # varchar()
    age = sqlalchemy.Column(sqlalchemy.Integer)
class Userinfo(base):
    __tablename__='userinfo'
    id = sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
    phone = sqlalchemy.Column(sqlalchemy.String(20))
class Shop(base):
    __tablename__='shop'
    id = sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
    name = sqlalchemy.Column(sqlalchemy.String(32))
#     User(name='world',age=1),
#     User(name='python',age=28),
#     User(name='PHP', age=30),
# session.commit()
# 查询所有的数据 返回一个列表
# res = session.query(User).all()
# for i in res:
#     print(i.name,i.age)
# 通过主键查询一条数据 返回一个对象
# res = session.query(User).get(1)
# print(res.name,res.age)
# 条件查询 返回的是一个列表
# res = session.query(User).filter_by(name='hello').all()
# print(res)
# res = session.query(User).filter(User.name=='hello').all()
# print(res)
# 修改数据
# res = session.query(User).get(1)
# print(res.name)
# res.name='HELLO'
# session.commit()
# 删除数据
res = session.query(User).get(1)
session.delete(res)
session.commit()
                    一、视图 view1.定义:当查询的复杂度很高时,指多字段,多关系查询,会导致sql语句混乱,不利于sql语句的编写和编写的sql语句的可读性,引入了视图视图是一张虚拟的表,有字段和数据,只存放查询语句视图有字段有行,但是视图基于源表2.特点:视图的优点1.简单:视图构建了一个虚拟的表,表里的数据是来源于复杂的查询语句,我们将复杂的查询语句存入视图,使用是直接调用视图2.安全...
db_mysql:Search_MySql()数据查询类
httprequests:HttpRequest()请求类
conftest:pytest的setup和teardown机制
test_cmm_apiassert:Test_Costom()测试用例
read_data:readExcel()读excel
1、配置文件方法封装,配置数据分离
2、单独封装请求类:请求不需区分get or post 接口类型
3、多种读取excel方法封装(单列读取,全部读取,根据用例名称读取)
4、pytest的setup和teardown机制使用
5、测试结果回写excel
6、allure报告上传青云对象存储
7、日志写入log.txt
8、测试结果与数据库对比验证
9、丰富的断言库和模拟数据库使用
def main():
    # 创建connection连接
    con = connect(host='127.0.0.1', port=3306, user='root', password='1213556247', database='jing_dong',
                  charset='utf8')
    # 获取C.
    form = NameForm()
    if form.validate_on_submit():
        user = User.query.filter(username=form.name.data).first()
        if user is None:
            user = User(username=
1,为什么需要创建mysql触发器?
比如说我往tb1表里面插入一条数据的时候,同时需要往日志表tb2中插入这条数据,这时候就需要创造一个触发器当我们往tb1中插入一条数据的时候,系统自动往tb2中插入一条数据。
2,创建触发器:(查询没有触发器)
3,更改终结符,比如将终结符';'改为'//':delimiter ...
				
以非字母 [^a-zA-Z] 以多个或零个非字母 [^a-zA-Z]* 以字母开头 ^[a-zA-Z] 以多个或零个}开头 [^}]* MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你...
为了保证在应用程序、数据库或系统出现错误后,数据库能够被还原,以保证数据库的完整性,所以需要进行回滚。 回滚(rollback)就是在事务提交之前将数据库数据恢复到事务修改之前数据库数据状态。 例如,用户A给用户B转账,在数据库中就需要给A与B的账户信息进行修改(update)操作,而这两条sql语句必须都执行或者都不执行。 例如先执行用户B的修改(update)语句,使用户B的账户金额增加了1...
索引在MySQL中叫做"键",是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键。 当表中数据量比较大,索引对于性能的影响比较重要。 索引优化是对查询性能优化最有效的手段,能够将查询性能提高好几个数量级。 索引分类:1、普通索引 2、唯一索引(unique) 3、全文索引(fulltext) 4、单列索引 5、多列索引 6、空间索引 创建索引: 1、 创建表时候创建索引:create table 表名(字段1 类型 约束,字段2 类型 约束,索引修饰符 index 索引名(字段)); 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。 .安全性。可以基于数据库的值使用户具有操作数据库的某种权利。 # 可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。 # 可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。 审计。可以...
# 使用sqlalchemy连接mysql engine = create_engine('mysql+pymysql://root:password@localhost:3306/test_db?charset=utf8mb4')
docker(虚拟化,沙箱(沙盒),简介,docker和vm的区别,安装,基本操作,基本使用) 镜像的操作 容器的操作 使用mysql镜像 使用canda创建虚拟环境 X___V: 应该是docker能做的事情VM都能做, 但是VM能做的docker就不一定能做到了。比如:docker在Linux系统就没办法运行windows系统的应用, 但虚拟机就能做到 yum源的配置 镜像源的配置 one_a: 如果没有dockers的文件有必要再创建一个么,第一步完成后我的yum就已经可以使用了