美文网首页
Flask-模型

Flask-模型

作者: 遇明不散 | 来源:发表于2019-05-08 15:55 被阅读0次

模型

什么是模型

模型是根据数据库中表的结构来创建出来的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)

相关文章

  • Flask-模型

    模型 什么是模型 模型是根据数据库中表的结构来创建出来的class。每一张表到编程语言中就是一个class,表中的...

  • Flask 框架(2)-模板

    Flask-模板

  • flask-分页、模型对应关系

    一、分页 二、模型关系 1.一对多 学生类 班级类 绑定学生和班级关联关系 通过班级查找学生信息 通过学生查找班级...

  • python版websocket

    背景 目前看到实现websocket的框架的- django的channels- flask- sanic好奇,用...

  • flask-信号

    Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为。 使用方法...

  • Flask-基础

    网页的分类 静态网页:无法与服务器进行交互的网页 动态网页:能够与服务器进行交互的网页 WEB与服务器 WEB 网...

  • Flask-模板

    模板-Templates 什么是模板 模板是一个包含响应文本的文件(通常是html文件),该文件中允许包含"占位变...

  • Flask-路由

    路由(route) 什么是路由 客户端将请求发送给web服务器,web服务器再将请求发送给flask程序实例,程序...

  • Flask- 部署

    1.创建虚拟环境文件夹 mkdir src 2.创建虚拟环境virtualenv --no-site-packa...

  • flask-模板

    一、模板的定义 二、模板引擎 flask使用jinja2作为默认模板引擎 2-1:默认配置 template_fo...

网友评论

      本文标题:Flask-模型

      本文链接:https://www.haomeiwen.com/subject/wogeoqtx.html