模型 - 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)
-
CRUD
- 增加 - C
- 创建实体类对象,并为对象的属性赋值
user = Users()
user.username = “小红”
user.age = 30
user.isActive = True
user.birthday = “1980-10-12” - 将实体对象保存回数据库
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 "增加数据成功"
- 创建实体类对象,并为对象的属性赋值
- 增加 - C
-
查询 – 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))
- 基于 db.session 进行查询
-
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 "查询成功"
-
查询执行函数
作用:在query的基础上得到最终的查询结果
语法:db.session.query(XXX).查询执行函数()- 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 "成功了"
- first()
以实体对象的方式返回第一条数据
没有查询到数据返回None - first_or_404()
效果同上
没有查询到结果则相应404 - count()
返回查询结果的数量
- all()
-
查询过滤器函数
作用:在db.session.query()追加条件
语法:db.session.query(XX).过滤器函数().执行函数()- filter()
各种查询条件均可实现 where - filter_by()
只做等值条件判断
语法:db.session.query(xxx).filter_by(属性=值).all()
示例:
查询Users中id=2的用户信息
db.session.query(Users).filter_by(id=2).all() - limit()
获取限定函数
示例:获取Users中前两条数据
db.session.query(Users).limit(2).all() - 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())
limit@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())
实现分页浏览@app.route("/06-limit") def limit_views(): users = db.session.query(Users).limit(2).all() print(users) return "...成功"
HTML页面@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())
<!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>
- filter()
-
- 基于 db.session 进行查询