模型 - Models--CRUD----(2)

模型 - Models

#创建实体类--Usres,映射到数据库中users表
#创建字段id,主键自增
#创建字段username,长度为80的字符串,不能为空,值唯一,加索引
#创建字段age,整数,允许为空
#创建字段email  长度为120的字符串,必须唯一
class Users(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(80),nullable=False,unique=True,index=True)
    age = db.Column(db.Integer,nullable=True)
    email = db.Column(db.String(120),unique=True)
  1. CRUD

    1. 增加 - C
      1. 创建实体类对象,并为对象的属性赋值
        user = Users()
        user.username = “小红”
        user.age = 30
        user.isActive = True
        user.birthday = “1980-10-12”
      2. 将实体对象保存回数据库
        db.session.add(user) #增加数据
        db.session.commit() #提交事务
        @app.route('/01-add')
        def add_views():
            # 1.创建User的对象并赋值
            user = Users()
            user.username = "小红"
            user.age = 30
            user.email = "tianxuan.qi@163.com"
            # user.birthday = "1998-10-12"
            # 2.将user的对象保存回数据库
            db.session.add(user)
            # 3.提交事物
            # db.session.commit()
            # 4.响应
            return "增加数据成功"
        
  2. 查询 – R

    class Wife(db.Model):
        id = db.Column(db.Integer,primary_key=True)
        wname = db.Column(db.String(30))
        isActive = db.Column(db.Boolean, default=True)
        # 增加一个列birthday
        birthday = db.Column(db.Date)
    
    
    class User(db.Model):
        __tablename__ = "user"
        id = db.Column(db.Integer,primary_key=True)
        username = db.Column(db.String(30),unique=True,nullable=False)
        email = db.Column(db.String(30))
        url = db.Column(db.String(60))
        password = db.Column(db.String(16))
    
    1. 基于 db.session 进行查询
      1. db.session.query()
        参数:
        要查询的列,如果查询多个列的话使用,隔开,如果要查询所有列,参数为实体类名

         示例:
         		1.查询User实体类中的id,username
         			db.session.uqery(Users.id,Users.username)
         		2.查询Users实体类中所有的类
         			db.session.query(Users)
         		3.查询Users以及Wife实体类所有的列
         			db.session.query(Users,Wife)
         返回值:
         	返回一个Query对象,类型为BaseQuery
        
        @app.route("/03-query")
        def query_views():
            #1.查询Users实体中的id,username两个列的值
            query = db.session.query(Users.id,Users.username)
            print(query)
            # print(type(query))
        
            # 2.查询Users实体中的所有
            users = db.session.query(Users).all()
            for u in users:
                print(f"{u.id},用户名:{u.username},年龄:{u.age}")
            print(users)
        
            # 3.查询users实体中第一条数据
            user1 = db.session.query(Users).first()
            print(user1.email)
            # 4.查询users实体中共有多少条数据
            user_count = db.session.query(Users).count()
            print(user_count)
            return "查询成功"
        
      2. 查询执行函数
        作用:在query的基础上得到最终的查询结果
        语法:db.session.query(XXX).查询执行函数()

        1. all()
          以列表的方式返回所有数据
          @app.route('/04-filter')
          def filter_views():
              # 1.查询年龄大于30的
              result = db.session.query(Users).filter(Users.age > 25).all()
              print(result)
              print(type(result))
              return "成功了"
          
        2. first()
          以实体对象的方式返回第一条数据
          没有查询到数据返回None
        3. first_or_404()
          效果同上
          没有查询到结果则相应404
        4. count()
          返回查询结果的数量
      3. 查询过滤器函数
        作用:在db.session.query()追加条件
        语法:db.session.query(XX).过滤器函数().执行函数()

        1. filter()
          各种查询条件均可实现 where
        2. filter_by()
          只做等值条件判断
          语法:db.session.query(xxx).filter_by(属性=值).all()
          示例:
          查询Users中id=2的用户信息
          db.session.query(Users).filter_by(id=2).all()
        3. limit()
          获取限定函数
          示例:获取Users中前两条数据
          db.session.query(Users).limit(2).all()
        4. offset()
          指定结果的偏移量
          示例:获取Users中跳过前两条数据的剩余数量
          db.session.query(Users).offset(2)
          @app.route('/05-users')
          def users_views():
              #查询Users中年龄为30的用户信息
              result = db.session.query(Users).filter(Users.age == 30).all()
          
              # 查询isActive为True或者年龄大于30岁的Users
              # or:使用  or_函数
              users = db.session.query(Users).filter(or_(Users.age==30,Users.id>2)).all()
              print(users)
          
              # 5.查询email中包含an的Users的信息
              # 模糊查询like,需要使用实体类属性提供的like()完成查询
              kw = "an"   #模拟查询关键词
              users = db.session.query(Users).filter(Users.email.like('%'+kw+'%'))
          
              # 查询年龄是30或者17或者45的   信息   模糊查询  in_  需要实体类提供in_函数
              users = db.session.query(Users).filter(Users.age.in_([30,17,45])).all()
          
              #查询年龄在35到40之间的Users信息  模糊查询  between..and..需要使用实体类提供的方法between(值1.值2)
              users = db.session.query(Users).filter(Users.age.between(30,45)).all()
          
              return render_template("05-users.html", params = locals())
          
          @app.route("/06-users")
          def users_views1():
              users = db.session.query(Users).filter(Users.age > 0)
              print(users)
          
              if "kw" in request.args:
                  kw = request.args['kw']
                  users = users.filter(or_(Users.username.like("%"+kw+"%"),
                                           Users.email.like("%"+kw+"%")))
              print(users)
              users = users.all()
              return render_template("05-users.html",params = locals())
          
          limit
          @app.route("/06-limit")
          def limit_views():
              users = db.session.query(Users).limit(2).all()
              print(users)
              return "...成功"
          
          实现分页浏览
          @app.route("/page")
          def page():
              pageCount = 3
              currentPage = int(request.args.get('currentPage', 1))
          
          
              #首页
              firstpage = 1
              #上一页
              if currentPage <= 1:
                  prvepage = currentPage = 1
              else:
                  prvepage = currentPage -1
              #尾页
              lastpage = db.session.query(Users).count() // pageCount
              if db.session.query(Users).count() % pageCount:
                  lastpage += 1
              #下一页
              if currentPage >= lastpage:
                  nextpage = currentPage = lastpage
              else:
                  nextpage = currentPage + 1
          
              ost = (currentPage - 1) * pageCount
          
              users = db.session.query(Users).offset(ost).limit(pageCount).all()
              return render_template("05-users.html",params = locals())
          
          HTML页面
          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>Title</title>
          </head>
          <body>
              <form action="06-users">
                  <input type="text" name="kw" value="{{params.kw}}">
                  <button>查询</button>
          
              </form>
              <table width="500" border="1">
                  <tr>
                      <th>用户名</th>
                      <th>年龄</th>
                      <th>邮箱</th>
                      <th>生日</th>
                      <th>操作</th>
                  </tr>
                  {% for u in params.users %}
                      <tr>
                          <td>{{u.username}}</td>
                          <td>{{u.age}}</td>
                          <td>{{u.email}}</td>
                          <td>{{u.id}}</td>
                          <td>
                              <a href="#">修改</a>
                              <a href="#">删除</a>
                          </td>
                      </tr>
                  {% endfor %}
              </table>
              <form>
                  <a href="/page?currentPage={{params.firstpage}}">首页</a>
                  <a href="/page?currentPage={{params.prvepage}}">上一页</a>
                  <a href="/page?currentPage={{params.nextpage}}">下一页</a>
                  <a href="/page?currentPage={{params.lastpage}}">尾页</a>
                  <input type="number" name="currentPage">
                  <button>查询</button>
              </form>
          </body>
          </html>
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值