第1关:查询操作
知识点
1.Flask
操作数据库有两种方式,一种是使用Flask-sqlalchemy
模块实现,另一种是直接使用pymysql
模块,通过编写sql
语句操作数据库。
2.文件结构
flask_edu
├── app
| ├── __init__.py
| ├── models.py # 数据模型文件
| ├── templates # 用于存储html文件的文件夹
├── config.py # 配置文件
└── test.py # 操作数据库的文件
(1)config.py:实现连接数据库功能;(使用SQL语句实现时不需要配置)
(2)__init__.py:创建Flask实例,使config.py文件生效;
(3)models.py:数据库表模型,实训关系对象映射;
(4)test.py:设置路由以及编写查询语句等操作文件。
3.常用过滤器:
名称 | 说明 |
---|---|
filter() | 把过滤器添加到原查询上,返回一个新查询 |
filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |
limit() | 使用指定的值限制原查询返回的结果数量,返回一个新查询 |
offset() | 偏移原查询返回的结果,返回一个新查询 |
order_by() | 根据指定条件对原查询结果进行排序,返回一个新查询 |
group_by() | 根据指定条件对原查询结果进行分组,返回一个新查询 |
编程要求
message
表结构与数据如下:
列名 | 说明 | 类型 |
---|---|---|
id | 表id(自动递增,主键) | int |
provincename | 省名 | varchar |
cityname | 省会名 | varchar |
ct | 用户数量 | int |
请仔细阅读右侧代码,根据方法内的提示,在Begin-End
区域内进行代码补充,具体任务如下:
- 首先完成
config.py
文件,实现对数据库的连接,数据库名为web
,Mysql
用户名为root
,密码为123123
; - 完成
models.py
文件实现表模型的创建; - 完成
test.py
文件实现查询根据用户数量降序排序之后的结果,降序可以使用DESC
方法。
#config.py
class Config(object):
#连接数据库
# ********* Begin *********#
SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:123123@localhost:3306/web?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS=True
# ********* End *********#
#models.py
from app import db
class Message(db.Model):
#表模型
#********* Begin *********#
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
provincename=db.Column(db.String(255))
cityname=db.Column(db.String(255))
ct=db.Column(db.Integer)
#********* End *********#
#test.py
from app import db,app
from models import Message
from flask import render_template
@app.route("/select")
def select():
'''
首先根据ct这一列进行序排序
然后将每一列的数据转换成一个列表
'''
# ********* Begin *********#
result = Message.query.order_by(Message.ct.desc()).all()
province = list(map(lambda x:x.provincename,result))
city = list(map(lambda x:x.cityname,result))
count = list(map(lambda x:x.ct,result))
# ********* End *********#
return render_template("index.html",city=city,count=count, province=province)
@app.route("/")
def home():
return render_template("home.html")
if __name__ == "__main__":
app.run(debug = True,host="0.0.0.0",port=8080)
第2关:增加操作
编程要求
message
表结构:
列名 | 说明 | 类型 |
---|---|---|
id | 表id(自动递增,主键) | int |
provincename | 省名 | varchar |
cityname | 省会名 | varchar |
ct | 用户数量 | int |
- 按照要求完成
config.py
文件的连接数据库以及models.py
文件表模型的创建; - 在
test.py
文件中使用request.form()
获取POST
请求的表单数据(后台会自动发送一个POST
请求,表单内容为纽约州 纽约市 1205
); - 将获取下来的数据添加到数据库中。
#config.py
class Config(object):
#连接数据库
# ********* Begin *********#
SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:123123@localhost:3306/web?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS=True
# ********* End *********#
#models.py
from app import db
class Message(db.Model):
#表模型
# ********* Begin *********#
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
provincename=db.Column(db.String(255))
cityname=db.Column(db.String(255))
ct=db.Column(db.Integer)
# ********* End *********#
#test.py
from app import app,db
from models import Message
from flask import Flask,render_template,request,redirect
@app.route('/insert',methods=['GET','POST'])
def insert():
#进行添加操作
# ********* Begin ********* #
newMessage = Message(provincename='纽约州',cityname="纽约市",ct=1205)
db.session.add(newMessage)
db.session.commit()
# ********* End ********* #
return redirect('/')
@app.route("/insert_page")
def insert_page():
#跳转至添加页面
return render_template("insert.html")
@app.route("/")
def home():
listCity = Message.query.order_by(Message.id.desc()).all()
return render_template("home.html",city_list = listCity)
if __name__ == "__main__":
app.run(debug=True,host="0.0.0.0", port=8080)
第3关:删除操作
编程要求
message
表结构:
列名 | 说明 | 类型 |
---|---|---|
id | 编号(自动递增,主键) | int |
provincename | 省名 | varchar |
cityname | 省会名 | varchar |
ct | 用户数量 | int |
测试说明
平台会部署你的服务器,并尝试调用你补全的delete()
方法,传入参数为 id = 1
。
#test.py
from app import db,app
from models import Message
from flask import render_template,redirect,request
@app.route("/delete",methods=['GET'])
def delete():
#操作数据库删除目标数据 前台传入的参数为 id
# ********* Begin *********#
u=Message.query.filter_by(id=1).first()
db.session.delete(u)
db.session.commit()
# ********* End *********#
#删除完重定向到主页
return redirect('/')
@app.route("/")
def home():
listCity = Message.query.order_by(Message.id.desc()).all()
return render_template("home.html",city_list = listCity)
if __name__ == "__main__":
app.run(debug = True,host="0.0.0.0",port=8080)
#config.py
class Config(object):
#连接数据库
# ********* Begin *********#
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123123@localhost:3306/web?charset=utf8"
SQLALCHEMY_TRACK_MODIFICATIONS = True
# ********* End *********#
#models.py
from app import db
class Message(db.Model):
#表模型 定义四个字段 id ct provincename cityname
# ********* Begin *********#
id=db.Column(db.Integer, primary_key=True)
provincename = db.Column(db.String(255))
cityname = db.Column(db.String(255))
ct = db.Column(db.Integer)
# ********* End *********#
第4关:修改操作
编程要求
message
表结构:
列名 | 说明 | 类型 |
---|---|---|
id | 表id(自动递增,主键) | int |
provincename | 省名 | varchar |
cityname | 省会名 | varchar |
ct | 用户数量 | int |
请仔细阅读右侧代码,使用普通**sql
**语句完成任务,在Begin-End
区域内进行代码补充,具体任务如下:
- 首先使用
request.form()
获取表单数据中的id
、provincename
、cityname
、ct
、id
是不可以修改的; - 将内蒙古呼和浩特市的用户数修改为
10
万。
from app import app,db
from models import Message
from flask import render_template
from flask import redirect,request
import pymysql
@app.route("/alter",methods=['POST'])
def alter():
#接收参数,修改数据
# ********* Begin *********#
u=Message.query.filter_by(id=1).first()
u.ct=100000
db.session.commit()
# ********* End *********#
return redirect('/')
#修改页面
@app.route("/alter_page",methods=['GET'])
def alter_page():
id = request.args.get("id")
province = request.args.get("provincename")
cityname = request.args.get("cityname")
ct = request.args.get("ct")
message = Message(id = id,provincename=province,cityname=cityname,ct=ct)
print(message)
return render_template("alter.html",message = message)
@app.route("/")
def home():
listCity = Message.query.order_by(Message.id.desc()).all()
return render_template("home.html",city_list = listCity)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=8080)