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())
分析:
- 创建数据库引擎使用sqlalchemy.create_engine(db_url)方法,传入一个数据库url地址作为参数。
- db_url的格式为:
dialect+driver://username:password@host:port/database?charset=utf8
其中dialect表示数据库类型,这里使用的是mysql;driver表示python中连接数据库的驱动,这里使用pymysql;username表示数据库的用户名;password表示连接数据库的密码;host:port表示数据库的地址(ip+端口);database表示数据库名字
2.ORM模型介绍
-
前面我们介绍了使用SQLAlchemy执行原生的sql命令,但实际项目中当我们创建的sql表增多时,使用这种方式将十分不方便且不安全。所以实际项目中我们都是使用ORM模型来操作数据库
-
ORM(Object Relationship Mapping),即对象关系映射,通过ORM模型,我们可以使用类去操作数据库,而不需要写原生的SQL语句。
ORM是通过把数据表映射成代码中的类,把字段作为类的属性,ORM在执行对象操作时最终把对应的操作转换为数据库的原生语句。 -
使用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()
运行结果如下:
分析:
- 创建模型类时都需要继承declarative_base()创建的基类
__tablename__
:用来指定数据库表名,如果不指定会以类名的小写字母来作为数据库表名- 使用Column()来指定字段的类型,约束属性。第一个参数为数据类型,后面的参数都为字段的约束属性
- 常见的数据类型有:
- Integer:整数类型
- Float:浮点数类型
- Boolean:布尔类型
- DECIMAL:定点类型,可以指定小数的位数和精度
- Enum:枚举类型,指定几个值用于选择
- Date:传递datetime.date()
- Time: 传递datetime.time()
- DateTime: 传递datetime.datetime()
- String: 字符串类型,使用时需要指定长度
- Text:文本类型
- LONGTEXT: 长文本类型
- 常见的约束属性有:
- default
默认值。 - nullable
是否可空。 - primary_key
是否为主键。 - unique
是否唯一。 - autoincrement
是否自动增长。 - onupdate
指定在更新数据的时候执行的函数。 - name
该属性在数据库中的字段映射。
- default
举例:
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()
运行后结果如下:
分析:
- 添加数据需要先使用sessionmaker()生成一个关联数据库的session,使用session.add_all()来完成对数据的添加
- 添加完数据后需要使用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)
运行结果如下:
分析:
-
filter和filter_by都可以对数据进行过滤,不同之处在于filter()传入判断条件作为参数。filter_by()传入关键字作为参数
-
filter常用的过滤条件有:
-
equals
filter(Book.name == 'Name 3')
-
not equals
filter(Book.name != 'Name 3')
-
like
filter(Book.name.like("%Name%")) # %用来表示任意字符
-
in
filter(Book.name.in_(['Name 1', 'Name 2'])) # in_的参数也可以是query的查询结果 filter(Book.name.in_(session.query(Book.name).filter(Book.name.like('%Name%'))))
-
not in
filter(~Book.name.in_(['Name 1', 'Name 2']))
-
is null
filter(Book.name == None) # 或者是 filter(Book.name.is_(None))
-
is not null
filter(User.name != None) # 或者是 filter(User.name.isnot(None))
-
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()
-
or
filter(or_python自动化自动化测试平台开发:4.后端开发之用例的储存和查看
python自动化自动化测试平台开发:2.flask技术讲解上
python自动化自动化测试平台开发:3.flask技术讲解上
python自动化自动化测试平台开发:7.前端开发之vue基础讲解
-