python自动化自动化测试平台开发:2.flask技术讲解下

Posted new nm个对象

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python自动化自动化测试平台开发:2.flask技术讲解下相关的知识,希望对你有一定的参考价值。

一.flask实现数据持久化

所谓数据持久化也就是讲数据写入到数据库或者文件中保存。一般我们在代码中操作数据库并不是直接写sql语句,而是使用ORM模型。即以操作类的方式来操作数据库。
在这里插入图片描述

1.SQLAlchemy简介

SQLAlchemy是一款ORM模型的数据库框架,可以实现以类的形式来操作数据库。

安装方式:pip install SQLAlchemy

SQLAlchemy操作原生数据库命令

from sqlalchemy import create_engine

#  主机地址
HOSTNAME = 'xxx.xxx.xxx.xxx'
# 数据库
DATABASE = 'test'
# 端口号,一般固定,默认为3306
PORT = 3306
# 用户名和密码
USERNMAE = 'root'
PASSWORD = 'xxx'

# 创建数据库引擎
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNMAE,PASSWORD,HOSTNAME,PORT,DATABASE)
engine = create_engine(DB_URL)

# 使用引擎连接数据库
with engine.connect() as conn:
    # 执行sql语句
    result = conn.execute("select * from users")
    print(result.fetchone())

分析:

  1. 创建数据库引擎使用sqlalchemy.create_engine(db_url)方法,传入一个数据库url地址作为参数。
  2. db_url的格式为:dialect+driver://username:password@host:port/database?charset=utf8其中dialect表示数据库类型,这里使用的是mysql;driver表示python中连接数据库的驱动,这里使用pymysql;username表示数据库的用户名;password表示连接数据库的密码;host:port表示数据库的地址(ip+端口);database表示数据库名字

2.ORM模型介绍

  1. 前面我们介绍了使用SQLAlchemy执行原生的sql命令,但实际项目中当我们创建的sql表增多时,使用这种方式将十分不方便且不安全。所以实际项目中我们都是使用ORM模型来操作数据库

  2. ORM(Object Relationship Mapping),即对象关系映射,通过ORM模型,我们可以使用类去操作数据库,而不需要写原生的SQL语句。
    ORM是通过把数据表映射成代码中的类,把字段作为类的属性,ORM在执行对象操作时最终把对应的操作转换为数据库的原生语句。

  3. 使用ORM模型,可以减少我们sql语句的使用,且能很好的实现代码复用,对于安全性也能大大增加

在这里插入图片描述

3.使用ORM模型创建表

from sqlalchemy import create_engine,Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

#  主机地址
HOSTNAME = 'xxx.xxx.xxx.xxx'
# 数据库
DATABASE = 'test'
# 端口号,一般固定,默认为3306
PORT = 3306
# 用户名和密码
USERNMAE = 'root'
PASSWORD = 'xxx'

# 创建数据库引擎
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNMAE,PASSWORD,HOSTNAME,PORT,DATABASE)
engine = create_engine(DB_URL)

# 生成一个基类,供模型类继承
Base = declarative_base(engine)

# 创建模型类
class Students(Base):
    # 指定数据库表名,如果不指定会以类名的小写字母来作为数据库表名
    __tablename__ = 'students'
    # 给定字段
    id = Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(50),nullable=False)
    gender = Column(Integer,default=1,comment='1为男,2为女')

    # 格式化类的默认输出格式
    def __str__(self):
        return f"<Student(id={self.id},name={self.name},gender={self.gender})>"

# 将模型映射到数据库中,只有映射后才能在数据库中生效
Base.metadata.create_all()

运行结果如下:

在这里插入图片描述

分析:

  1. 创建模型类时都需要继承declarative_base()创建的基类
  2. __tablename__:用来指定数据库表名,如果不指定会以类名的小写字母来作为数据库表名
  3. 使用Column()来指定字段的类型,约束属性。第一个参数为数据类型,后面的参数都为字段的约束属性
  4. 常见的数据类型有:
    1. Integer:整数类型
    2. Float:浮点数类型
    3. Boolean:布尔类型
    4. DECIMAL:定点类型,可以指定小数的位数和精度
    5. Enum:枚举类型,指定几个值用于选择
    6. Date:传递datetime.date()
    7. Time: 传递datetime.time()
    8. DateTime: 传递datetime.datetime()
    9. String: 字符串类型,使用时需要指定长度
    10. Text:文本类型
    11. LONGTEXT: 长文本类型
  5. 常见的约束属性有:
    1. default
      默认值。
    2. nullable
      是否可空。
    3. primary_key
      是否为主键。
    4. unique
      是否唯一。
    5. autoincrement
      是否自动增长。
    6. onupdate
      指定在更新数据的时候执行的函数。
    7. name
      该属性在数据库中的字段映射。

举例:

from datetime import datetime

from sqlalchemy import create_engine,Column, Integer, String,DECIMAL,Boolean,Enum,DateTime
from sqlalchemy.ext.declarative import declarative_base

#  主机地址
HOSTNAME = '192.168.1.102'
# 数据库
DATABASE = 'test'
# 端口号,一般固定,默认为3306
PORT = 3306
# 用户名和密码
USERNMAE = 'root'
PASSWORD = 'xxxx'

# 创建数据库引擎
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNMAE,PASSWORD,HOSTNAME,PORT,DATABASE)
engine = create_engine(DB_URL)

# 生成一个基类,供模型类继承
Base = declarative_base(engine)

# 创建模型类
class Book(Base):
    __tablename__ = 'book'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)
    price = Column(DECIMAL(20, 8))
    is_delete = Column(Boolean)
    btype = Column(Enum('Science', 'Computer'))
    release_time = Column(DateTime)
    update_time = Column(DateTime, onupdate=datetime.now())

# 将模型映射到数据库中,只有映射后才能在数据库中生效
Base.metadata.create_all()

运行结果如下:

在这里插入图片描述

4.使用ORM模型添加数据

from datetime import datetime
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine,Column, Integer, String,DECIMAL,Boolean,Enum,DateTime
from sqlalchemy.ext.declarative import declarative_base

#  主机地址
HOSTNAME = '192.168.1.102'
# 数据库
DATABASE = 'test'
# 端口号,一般固定,默认为3306
PORT = 3306
# 用户名和密码
USERNMAE = 'root'
PASSWORD = 'xxx'

# 创建数据库引擎
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNMAE,PASSWORD,HOSTNAME,PORT,DATABASE)
engine = create_engine(DB_URL)

# 生成一个基类,供模型类继承
Base = declarative_base(engine)

# 创建模型类
class Book(Base):
    __tablename__ = 'book'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)
    price = Column(DECIMAL(20, 8))
    is_delete = Column(Boolean)
    btype = Column(Enum('Science', 'Computer'))
    release_time = Column(DateTime)
    update_time = Column(DateTime, onupdate=datetime.now())

# 将模型映射到数据库中,只有映射后才能在数据库中生效
# Base.metadata.create_all()

# 使用sessionmaker创建一个session,使用session来完成对数据的增删查改
session = sessionmaker(bind=engine)()

# 添加数据到数据库中
data1 = Book(name='python',price=25.55,is_delete=False,btype='Science',release_time=datetime.now())
data2 = Book(name='java',price=54.23,is_delete=False,btype='Computer',release_time=datetime.now())
data3 = Book(name='c++',price=60.05,is_delete=False,btype='Computer',release_time=datetime.now())
session.add_all([data1, data2, data3])
# 提交数据,必须commit后才能生效
session.commit()

运行后结果如下:

在这里插入图片描述

分析:

  1. 添加数据需要先使用sessionmaker()生成一个关联数据库的session,使用session.add_all()来完成对数据的添加
  2. 添加完数据后需要使用session.commit()来完成数据的提交

5.使用ORM模型查询数据

5.1 查询所有数据

from datetime import datetime
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine,Column, Integer, String,DECIMAL,Boolean,Enum,DateTime
from sqlalchemy.ext.declarative import declarative_base

#  主机地址
HOSTNAME = '192.168.1.102'
# 数据库
DATABASE = 'test'
# 端口号,一般固定,默认为3306
PORT = 3306
# 用户名和密码
USERNMAE = 'root'
PASSWORD = 'xxx'

# 创建数据库引擎
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNMAE,PASSWORD,HOSTNAME,PORT,DATABASE)
engine = create_engine(DB_URL)

# 生成一个基类,供模型类继承
Base = declarative_base(engine)

# 创建模型类
class Book(Base):
    __tablename__ = 'book'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)
    price = Column(DECIMAL(20, 8))
    is_delete = Column(Boolean)
    btype = Column(Enum('Science', 'Computer'))
    release_time = Column(DateTime)
    update_time = Column(DateTime, onupdate=datetime.now())

    def __str__(self):
        return f'<"Book:(id={self.id},name={self.name},price={self.price},btype={self.btype})">'

# 将模型映射到数据库中,只有映射后才能在数据库中生效
# Base.metadata.create_all()

# 使用sessionmaker创建一个session,使用session来完成对数据的增删查改
session = sessionmaker(bind=engine)()
datas = session.query(Book).all()
for data in datas:
    print(data)
    print(data.name)
    print(data.price)

运行结果如下:
在这里插入图片描述

分析:

  • 使用session.query()来完成对数据的查询
  • 返回的对象为包含所有查询数据的可迭代对象

5.2 查询数据的指定字段

from datetime import datetime
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine,Column, Integer, String,DECIMAL,Boolean,Enum,DateTime
from sqlalchemy.ext.declarative import declarative_base

#  主机地址
HOSTNAME = '192.168.1.102'
# 数据库
DATABASE = 'test'
# 端口号,一般固定,默认为3306
PORT = 3306
# 用户名和密码
USERNMAE = 'root'
PASSWORD = 'xxx'

# 创建数据库引擎
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNMAE,PASSWORD,HOSTNAME,PORT,DATABASE)
engine = create_engine(DB_URL)

# 生成一个基类,供模型类继承
Base = declarative_base(engine)

# 创建模型类
class Book(Base):
    __tablename__ = 'book'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)
    price = Column(DECIMAL(20, 8))
    is_delete = Column(Boolean)
    btype = Column(Enum('Science', 'Computer'))
    release_time = Column(DateTime)
    update_time = Column(DateTime, onupdate=datetime.now())

    def __str__(self):
        return f'<"Book:(id={self.id},name={self.name},price={self.price},btype={self.btype})">'

# 将模型映射到数据库中,只有映射后才能在数据库中生效
# Base.metadata.create_all()

# 使用sessionmaker创建一个session,使用session来完成对数据的增删查改
session = sessionmaker(bind=engine)()
datas = session.query(Book.id,Book.name).all()
for data in datas:
    print(data)

运行结果如下:

在这里插入图片描述

分析:

  • 在query()中传入指定模型类的属性即可查询指定数据的字段

5.3 对查询的数据进行切片

查询的数据返回的是一个可迭代的对象,所以可以对查询的结果进行切片,也可以进行遍历。

from datetime import datetime
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine,Column, Integer, String,DECIMAL,Boolean,Enum,DateTime
from sqlalchemy.ext.declarative import declarative_base

#  主机地址
HOSTNAME = '192.168.1.102'
# 数据库
DATABASE = 'test'
# 端口号,一般固定,默认为3306
PORT = 3306
# 用户名和密码
USERNMAE = 'root'
PASSWORD = 'xxx'

# 创建数据库引擎
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNMAE,PASSWORD,HOSTNAME,PORT,DATABASE)
engine = create_engine(DB_URL)

# 生成一个基类,供模型类继承
Base = declarative_base(engine)

# 创建模型类
class Book(Base):
    __tablename__ = 'book'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)
    price = Column(DECIMAL(20, 8))
    is_delete = Column(Boolean)
    btype = Column(Enum('Science', 'Computer'))
    release_time = Column(DateTime)
    update_time = Column(DateTime, onupdate=datetime.now())

    def __str__(self):
        return f'<"Book:(id={self.id},name={self.name},price={self.price},btype={self.btype})">'

# 将模型映射到数据库中,只有映射后才能在数据库中生效
# Base.metadata.create_all()

# 使用sessionmaker创建一个session,使用session来完成对数据的增删查改
session = sessionmaker(bind=engine)()
datas = session.query(Book.id,Book.name).all()[1:3] # 获取第二三条数据
for data in datas:
    print(data)

运行结果如下:

在这里插入图片描述

分析:

  • 可以使用数组切片的方式对数组进行切片
  • 可以使用query(Book.id,Book.name).first()来获取第一条数据

5.4 对查询的数据进行过滤

可以使用filter或者filter_by来对数据进行过滤,获取满足条件的数据。

from datetime import datetime
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine,Column, Integer, String,DECIMAL,Boolean,Enum,DateTime
from sqlalchemy.ext.declarative import declarative_base

#  主机地址
HOSTNAME = '192.168.1.102'
# 数据库
DATABASE = 'test'
# 端口号,一般固定,默认为3306
PORT = 3306
# 用户名和密码
USERNMAE = 'root'
PASSWORD = 'xxx'

# 创建数据库引擎
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNMAE,PASSWORD,HOSTNAME,PORT,DATABASE)
engine = create_engine(DB_URL)

# 生成一个基类,供模型类继承
Base = declarative_base(engine)

# 创建模型类
class Book(Base):
    __tablename__ = 'book'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), nullable=False)
    price = Column(DECIMAL(20, 8))
    is_delete = Column(Boolean)
    btype = Column(Enum('Science', 'Computer'))
    release_time = Column(DateTime)
    update_time = Column(DateTime, onupdate=datetime.now())

    def __str__(self):
        return f'<"Book:(id={self.id},name={self.name},price={self.price},btype={self.btype})">'

# 将模型映射到数据库中,只有映射后才能在数据库中生效
# Base.metadata.create_all()

# 使用sessionmaker创建一个session,使用session来完成对数据的增删查改
session = sessionmaker(bind=engine)()
datas = session.query(Book).filter(Book.name=='python').all()
for data in datas:
    print(data)

print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
datas = session.query(Book).filter_by(name='python').all()
for data in datas:
    print(data)

运行结果如下:
在这里插入图片描述

分析:

  1. filter和filter_by都可以对数据进行过滤,不同之处在于filter()传入判断条件作为参数。filter_by()传入关键字作为参数

  2. filter常用的过滤条件有:

    1. equals

      filter(Book.name == 'Name 3')
      
    2. not equals

      filter(Book.name != 'Name 3')
      
    3. like

      filter(Book.name.like("%Name%")) # %用来表示任意字符
      
    4. in

      filter(Book.name.in_(['Name 1', 'Name 2']))
      # in_的参数也可以是query的查询结果
      filter(Book.name.in_(session.query(Book.name).filter(Book.name.like('%Name%'))))
      
    5. not in

      filter(~Book.name.in_(['Name 1', 'Name 2']))
      
    6. is null

      filter(Book.name == None)
      # 或者是
      filter(Book.name.is_(None))
      
    7. is not null

      filter(User.name != None)
      # 或者是
      filter(User.name.isnot(None))
      
    8. and

      filter(Book.name == 'Name 1', Book.price <= 50).all()
      filter(and_(Book.name == 'Name 1', Book.price <= 50)).all()
      filter(Book.name == 'Name 1').filter(Book.price <= 50).all()
      
    9. or

      filter(or_python自动化自动化测试平台开发:4.后端开发之用例的储存和查看

      python自动化自动化测试平台开发:2.flask技术讲解上

      python自动化自动化测试平台开发:3.flask技术讲解上

      python自动化自动化测试平台开发:7.前端开发之vue基础讲解

      python自动化自动化测试平台开发:8.前端开发实战上之环境搭建

      python自动化自动化测试平台开发:6.后端开发之用例报告的上传