Flask(4)

模型-(Models)

一、什么是模型

     模型,是根据数据库中表的结构而创建出来的class。
     每一张表对应到编程语言中,就是一个class
     表中的每一个列对应到编程语言中就是class中的一个属性。

二、模型的框架 - ORM

1、什么是ORM

         ORM :Object Relational Mapping
         简称:ORM,O/RM ,O/R Mapping
         中文名:对象关系映射

2、ORM的三大特征

     1、数据表(table)到编程类(class) 的映射
          数据库中的每一张表 对应到 编程语言中,都有一个类
          在ORM中:
                允许将数据表 自动 生成一个类
                允许将类 自动 生成一张数据表
     2、数据类型的映射
          将数据库表中的字段以及数据类型 对应到 编程语言中类的属性
           在ORM中:
               允许将表中的字段和数据类型自动映射到编程语言中
               也允许将类中的属性和数据类型也自动映射到数据库表中
     3、关系映射
           将数据库中表与表之间的关系 对应 到编程语言中类与类之间的关系
           数据库中表与表之间的关系:
                 1、一对一:
                     外键,主键关联,外键需要加唯一约束
                     A表中的一条数据只能与B表中的一条数据相关联
                     (使用外键约束 外加 唯一约束)
                 2、一对多:
                     外键,主键关联
                     A表中的一条数据可以与B表中的任意多条数据相关联,反之,B表中的一条数据只能与A表中一条数据相关联
                     ex:老师(Teacher)与课程(Course)
                         一门课程可以被多个老师所教授
                         一个老师最多只能教一门课程
                     (在“多”对表中增加外键 ,引用‘一’表中的主键)
                 3、多对多:
                     通过第三张关联表去关联两张表
                     A表中的一条数据可以与B表中的任意多条数据相关联,B表中的一条数据也可以与A表中的任意多条数据相关联
                     (通过第三张关联表来完成的关联关系)

3、ORM优点

       1、封装了数据库中的所有操作,大大提高了开发效率
       2、可以省略庞大的数据访问层,即便不用SQL编码也能完成对数据的CRUD操作

三、Flask 中的 ORM框架

1、数据库 和 框架配置

    在Python 和 Flask 中,使用的ORM框架是 - SQLAlchemy
    在Flask 中想使用 SQLAlchemy的话,需要进行安装:
          1、查看安装列表:pip3 list
          2、安装 SQLAlchemy
               pip3 install sqlalchemy
               pip3 install flask-sqlalchemy

2、创建数据库

   手动创建: create database flask default charset utf8 collate utf8_general_ci;

3、配置数据库

 1 from flask import Flask
 2 #将SQLAlchmey模块导入进来
 3 from flask_sqlalchemy import SQLAlchemy
 4 
 5 app = Flask(__name__)
 6 #为app指定数据库的配置信息
 7 app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:123456@localhost:3306/flask'
 8 #创建SQLAlchemy的实例,并将app指定给实例
 9 #db是SQLAlchemy的实例,表示的是程序正在使用的数据库,同时db也具备SQLAlchemy中的所有功能
10 db = SQLAlchemy(app)
11 
12 @app.route('/')
13 def index():
14     return "Hello World"
15 
16 if __name__ == "__main__":
17     app.run(debug=True)
配置数据库.py

四、定义模型

1、模型:

    数据库中的表在编程语言中的体现,其本质就是一个Python 的类(可称为:模型类 或 实体类)。类中的属性要与数据库表中的列相对应

2、创建语法:

         class MODELNAME(db.Model):
             __tablename__ = "TABLENAME"
             COLUMN_NAME = db.Column(db.TYPE,OPTIONS)

          1.MODELNAME:定义模型类的名称,根据表名设定
          2.TABLENAME:映射到数据库中表的名字
          3.COLUMN_NAME:属性名,映射到表中列的名字
          4.TYPE:映射到列的数据类型
          5.OPTIONS:列选项

    db.TYPE 列类型如下:
             类型名           python类型                     说明
             Integer            int                        普通整数,32位
             SmallInternet    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则表示该列要创建索引,默认为False
             nullable         设置为True则表示该列允许为空,默认是允许为空(True)
             default          为该列定义默认值

    练习:
           1.创建 Student 模型类
                 表名 : student
                 字段:
                     1.id,主键,自增
                     2.sname ,长度为30并且不允许为空的字符串
                     3.sage,年龄,整数
           2.创建 Teacher 模型类
                 表名 :teacher
                 字段:
                     1.id,主键,自增
                     2.tname,姓名,长度为30并且不许为空的字符串
                     3.tage,年龄,整数
           3.创建 Course 模型类
                 表名:course 
                 字段:
                     1.id ,主键,自增
                     2.cname,课程名称,长度为30并且不允许为空的字符串

五、数据库操作 - 插入

1.创建实体对象

2.完成插入

      db.session.add(Models实体对象)
       手动提交:
             db.session.commit()
       自动提交:
             app.config['SQLACHEMY_COMMIT_ON_TEARDOWN']=True
             作用:指定执行完成操作后自动提交,
             写在 app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:123456@localhost:3306/flask' 下面
       # 删除已创建的表结构
           db.drop_all()
       # 将创建好的实体类映射回数据库
           db.create_all()

六、数据库操作 - 查询

1、基于 db.session 进行查询

   1.db.session.query()
         该函数会返回一个Query对象,类型为 BaseQuery,该对象中包含了指定实体类对应的表中所有的数据

         该函数可以接收一个或多个参数,参数们表示的是要查询的实体对象是谁
   2.查询执行函数
         目的:在查询的基础上得到最终想要的结果
         语法:db.session.query(...).查询执行函数()
         函数                     说明
         all()               以列表的方式返回query中所有的查询函数结果
         first()             返回查询中的第一个结果,如果没有结果,则返回None
         first_or_404()   返回查询中的第一个结果,如果没有结果的话,则终止并返回404
         count()           返回查询结果的数量
         ex:# 查询执行函数 -all
             users = db.session.query(Users).all()
   3.查询过滤器函数
         作用:在查询的基础上,筛选部分行数据(增加筛选条件)
         语法:db.session.query(Models).过滤器函数(条件).查询执行函数()
         过滤器函数:               说明
         filter()            按指定条件进行过滤(多表,单表,定值,不定值..)
         filter_by()       按等值条件过滤时使用
         limit()             按限制行数获取
         order_by()      根据指定条件进行排序
         group_by()      根据指定条件进行分组
       过滤器函数详解:
          1、filter()
                     注意:条件必须由 模型类.属性 构成
               1、查询年龄 大于 30 的Users 的信息
                     db.session.query(Users).filter(Users.age>30).all()
               2、查询年龄大于30 并且 id大于1 的Users的信息
                     db.session.query(Users).filter(Users.age>30,Users.id > 1).all()
               3、查询年龄大于30 或者 id大于1 的Users的信息
                   注意:查询 或 的操作,要借助于 or_()
                     db.session.query(Users).filter(or_(Users.age>30,Users.id > 1)).all()
                     db.session.query(Users).filter(or_(条件1,条件2)).all()
               4、查询id为2的Users的信息
                   注意:等值判断必须使用 ==
                     db.session.query(Users).filter(Users.id==2).all()
               5.查询 email 中包含 'w' 的Users的信息 - 模糊查询
                   注意:模糊查询 like 需要使用实体类中属性提供的like()
                     db.session.query(Users).filter(Users.email.like('%w%')).all()
               6、查询 id 在 [2,3] 之间的 Users 的信息
                   注意:模糊查询 in 需要使用实体类中属性提供的in_([])
                     db.session.query(Users).filter(Users.id.in_([2,3])).all()
          2、filter_by()
                 查询 id=5的Users的信息
                     db.session.query(Users).filter_by(id=5).all()
          3、limit()
              参数:offset代表:偏移量(跳过)
                在整个查询结果中获取前5条数据   
                   db.session.query(Users).limit(5).all()
                使用limit 和offset 查询限制行数据
                   db.session.query(Users).limit(5).offset(1).all()
          4、order_by()
              参数:asc升序,desc降序
                对Users表中所有的数据按id降序排序
                     db.session.query(Users).order_by('id desc').all()
                按照age列的值降序排序,二级排序按照id升序排序
                     db.session.query(Users).order_by("age desc,id asc").all()
                使用 order_by 排序,先按照年龄升序排列,(年龄相同)再按照id降序排列
                     result = db.session.query(Users).order_by("age asc,id desc").all()
          5、group_by()
                 db.session.query(Users).group_by('age').all()
          6、聚合函数(sun max min count等...)
                 db.session.query(func.聚合函数(Models.Column).label('别名')).all()
               注意:Models.Column:为数据库名.列名
               ex:查询Users中所有的age的总和 - 聚合函数
                   result = db.session.query(func.sum(Users.age)).all()
              聚合函数:   
                 sum(): 求和      count(): 求数量      avg():平均值   
                 max():最大值    min():最小值   

2、基于Models 类进行查询

    Models.query.查询过滤器函数(条件参数).查询执行函数()
    参数:Models为数据库名

七、数据库操作 - 删除

1、查询出要删除的实体对象

    u=db.session.query(Models).filter_by(xxx).first()
    ex:
         user=db.session.query(Users).filter_by(id=5).first()

2、根据所提供的删除方法将信息删除

    db.session.delete(u)
        注意:真正的删除并不是通过删除操作完成,而是通过修改完成的

八、修改

    例如:将 id 为1 的用户的 username 改为 Wang WC ,年龄改为 40

1、查

    将 要修改的信息查询出来
       user = Users.query.filter_by(id=1).first()

2、改

    实体对象.属性 = 值
       user.username = "Wang WC"
       user.age = 40

3、保存

    db.session.add(实体对象)
       db.session.add(user)

 

posted on 2018-11-07 21:23  破天荒的谎言、谈敷衍  阅读(2170)  评论(0编辑  收藏  举报

导航