模型
什么是模型
模型是根据数据库中表的结构来创建出来的class。每一张表到编程语言中就是一个class,表中的每一个列,到编程语言中就是class中的一个属性。
创建和使用模型
什么是ORM
- Object Relational Mapping
- 简称:ORM , O/RM , O/R Mapping
- 中文:对象关系映射
ORM的三大特征
- 数据表(table)到编程类(class)的映射
- 数据库中的每一张表 对应 到编程语言中,都有一个类
- 在ORM中允许将数据表自动生成一个类,也允许将类自动生成一张表
- 数据类型的映射
- 将数据库表中的字段以及数据类型对应到编程语言中类的属性
- 在ORM中允许将表中的字段和数据类型自动映射到编程语言中,也允许将类中的属性和类型也映射到数据库表中
- 关系映射
- 将数据库中表之间的关系对应到编程语言中类之间的关系
ORM的优点
- 提高了开发的效率
- 可以省略庞大的数据访问层,即便不用SQL编码也能完成对数据的CRUD操作
定义模型
数据库和框架的配置
- 安装 SQLAlchemy
pip3 install sqlalchemy
pip3 install flask-sqlalchemy
- 创建数据库
create database flask default charset utf8 collate utf8_general_ci;
- 配置数据库
from flask_sqlalchmey import SQLAlchemy
app = Flask(__name__)
# 连接数据库
# app.config['SQLALCHEMY_DATABASE_URI']='mysql://username:pwd@host:port/dbname'
app.config['SQLALCHEMY_DATABASE_URI']='mysql:/root:123456@localhost:3306/flask'
# 指定让SQLAlchemy自动追踪程序的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# 指定执行完操作后自动提交
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 创建SQLAlchemy的实例
# db是SQLAlchemy的实例,表示程序正在使用的数据库,同时也获得了SQLAlchemy中的所有功能
db = SQLAlchemy(app)
if __name__ == "__main__":
app.run(debug=True)
定义模型
模型:数据库中的表在编程语言中的体现,其本质就是一个Python 的类(可称为:模型类或实体类)。类中的属性要与数据库表中的列相对应。
- 创建模型语法
class MODELNAME(db.Model):
__tablename__ = "TABLENAME"
COLUMN_NAME = db.Column(db.TYPE,OPTIONS)
# MODELNAME:定义模型类名称,根据表名设定
# TABLENAME:映射到数据库中表的名字
# COLUMN_NAME:属性名,映射到表中列的名字
# db.TYPE:映射到列的数据类型
# OPTIONS:列选项
-
db.TYPE
列类型
# 类型名 python类型 说明
# Integer int 普通整数,32位
# SamllInteger int 小范围整数,通常16位
# BigInteger int或long 不限精度的整数
# Float float 浮点数
# Numeric decimal.Decimal 定点数
# String str 变长字符串
# Text str 变长字符串,优化
# Unicode unicode 变长Unicode字符串
# UnicodeText unicode 优化后的变长Unicode
# Boolean bool 布尔值
# Date datetime.date 日期
# Time datetime.time 时间
# DateTime datetime.datetime 日期和时间
-
OPTIONS
列选项
# 选项名 说明
# primary_key 设置为True则表示该列为主键
# unique 设置为True则表示该列的值唯一
# index 设置为True则表示该列要创建索引
# nullable 设置为True则表示该列允许为空
# default 为该列定义默认值
- 将实体类映射回数据库
db.create_all()
数据库操作
插入
# Models为模型类实例
db.session.add(Models)
db.session.commit()
查询
基于 db.session 进行查询
# 该函数会返回一个Query对象,类型为 BaseQuery,包含了指定实体类对应的表中所有的数据
# 该函数也可以接受多个参数,参数表示的是要查询哪个实体
db.session.query()
- 查询执行函数
在查询的基础上得到最终想要的结果
db.session.query(...).查询执行函数()
# 以列表的方式返回查询的所有结果
db.session.query(...).all()
# 返回查询中的第一个结果,如果没有结果,则返回None
db.session.query(...).first()
# 返回查询中的第一个结果,如果没有结果,则终止并返回404
db.session.query(...).first_or_404()
# 返回查询结果的数量
db.session.query(...).count()
-
查询过滤器函数
在查询的基础上,筛选部分列出来- 按指定条件进行过滤(多表,单表,定值,不定值..)
db.session.query(..).filter(类名.属性名 条件操作符 条件).查询执行函数() # 查询年龄 大于 30 的Users 的信息 db.session.query(Users).filter(Users.age>30).all() 注意:条件必须由 模型类.属性 来组成 # 查询年龄 大于 30 且 id 大于5 的Users的信息 db.session.query(Users).filter(Users.age>30,Users.id > 5).all() # 查询年龄大于30 或者 id大于5 的Users的信息 # 注意:查询 或 的操作,要借助 or_() db.session.query(Users).filter(or_(条件1,条件2)).all() # 查询id等于5的Users的信息 # 注意:等值判断必须使用 == db.session.query(Users).filter(Users.id==5).first() # 查询 email 中包含 'w' 的users的信息 - 模糊查询 like db.session.query(Users).filter(Users.email.like('%w%')).all() # 查询 id 在 [1,2,3] 之间的 Users 的信息 db.session.query(Users).filter(Users.id.in_([1,2,3])).all()
- 按等值条件进行过滤
db.session.query(...).filter_by().查询执行函数() # 查询 id=5的Users的信息 db.session.query(...).filter_by(id=5).first()
- 按限制行数获取
db.session.query(...).limit().查询执行函数() # 在整个查询结果中获取前5条数据 db.session.query(...).limit(5).all() # 从第2条开始获取3条 db.session.query(Users).limit(2).offset(3).all()
- 根据指定条件进行排序
# 默认升序,在属性名前加 - 表示降序 db.session.query(...).order_by(类名.属性名).查询执行函数() # 对Users表中所有的数据按id降序排序 db.session.query(Users).order_by(-Users.id).all()
- 根据指定条件进行分组
db.session.query(...).group_by(属性名).all() # 按年龄进行分组 db.session.query(Users).group_by('age').all()
基于 Models进行查询
Models.query.查询过滤器(条件参数).查询执行函数()
删除和修改
删除
# 查询出要删除的实体
user = db.session.query(Users).filter_by(id=5).first()
# 根据所提供的删除方法将信息删除
db.session.delete(user)
修改
# 将 id 为1 的用户的 username 改为 Jason Wang ,年龄改为 18
# 查
user = Users.query.filter_by(id=1).first()
# 改
user.username = "Jason Wang"
user.age = 18
# 保存
db.session.add(user)
网友评论