数据库开发中级案例—PythonWeb框架应用

2024-01-19 16:50

本文主要是介绍数据库开发中级案例—PythonWeb框架应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

第1关 查询操作

使用SQLAlchemy实现

config.py

__init__.py

models.py

test.py

头歌实验代码

第2关 增加操作

不使用SQLAlchemy实现

使用SQLAlchemy

头歌实验代码

第3关 删除操作

不使用SQLAlchemy实现

使用SQLAlchemy

使用 request 获取 get 请求的参数

头歌实验代码

第4关 修改操作

不使用SQLAlchemy实现

使用SQLAlchemy

获取POST请求提交的参数

头歌实验代码 


第1关 查询操作

本关任务:通过Flask连接Mysql数据库,完成下方编程要求的任务。

相关知识

文件结构:

  1. flask_edu
  2. ├── app
  3. | ├── __init__.py
  4. | ├── models.py # 数据模型文件
  5. | ├── templates # 用于存储html文件的文件夹
  6. ├── config.py # 配置文件
  7. └── test.py # 操作数据库的文件

Flask操作数据库有两种方式,一种是使用Flask-sqlalchemy模块实现,另一种是直接使用pymysql模块,通过编写sql语句操作数据库。 

使用SQLAlchemy实现

SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。而Flask-SQLAlchemy是Flask扩展,它将对SQLAlchemy的支持添加到Flask应用程序中。它比原始的操作数据库的方法更加方便简洁。使用该模块依然需要使用pymysql连接的数据库,建立连接需要从两部分入手:

  1. 通过修改配置文件config.py来连接到Mysql数据库
  2. 使配置生效,SQLAlchemy实例化数据库(本实训通过配置__init__.py实现)

示例表中的数据:

config.py

实现连接数据库功能:

  1. class Config()
  2. SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@localhost:3306/database'
  3. # 'mysql+pymysql://用户名称:密码@ip:端口/数据库名称'
  4. SQLALCHEMY_TRACK_MODIFICATIONS = False #该配置项用于设置数据发生变更之后是否发送信号给应用

__init__.py

创建Flask实例,使config.py文件生效:

  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. from config import Config
  4. app = Flask(__name__) # 创建Flask实例
  5. db = SQLAlchemy(app)
  6. app.config.from_object(Config)

models.py

数据库表模型,实现关系对象映射:

  1. from app import db
  2. class Demo(db.Model):
  3. __table__ = "demo" #表名
  4. id = db.Column(db.Integer, primary_key=True)
  5. name = db.Column(db.String(255)) #id和name都为表中的字段名,

test.py

设置路由,以及编写查询语句等操作的文件:

  1. from app import db
  2. from models import Demo
  3. #查询数据
  4. Demo.query.all() #查询所有数据
  5. Demo.query.all()[1:3] #查询第二到第四条数据
  6. Demo.query.count() #查询有多少条数据
  7. Demo.query.first() #查询第一条数据
  8. Demo.query.filter_by(id=3).first()
  9. Demo.query.filter(Demo.id==3).first() #这两条都用于查询id为3的数据,`filter_by`里面不能用`!= `还有`> <` 等等,所以`filter`用得更多,`filter_by`只能用`=`
  10. Demo.query.filter(and_(Demo.name.startwith("B"),Demo.id.endswith(1))).all() # 查询name以'B'开头,id以1结尾的所有数据,与操作用and_,或用or_ ,非用not
  11. Demo.query.order_by("id").all() #查询所有数据,并以id排序

常用的过滤器:

名称说明
filter()把过滤器添加到原查询上,返回一个新查询
filter_by()把等值过滤器添加到原查询上,返回一个新查询
limit()使用指定的值限制原查询返回的结果数量,返回一个新查询
offset()偏移原查询返回的结果,返回一个新查询
order_by()根据指定条件对原查询结果进行排序,返回一个新查询
group_by()根据指定条件对原查询结果进行分组,返回一个新查询

使用SQL语句实现

Flask Web应用程序中也可以使用原始SQL对数据库执行增删改查操作。使用这种方法则不需要配置config.py文件和models.py文件,但是需要编写更多的SQL语句。

__init__.py

创建一个Flask实例,没有编写配置文件,所以不需要实现config.py

  1. from flask import Flask
  2. app = Flask(__name__) # 创建Flask实例

test.py

设置路由,以及编写查询语句等操作的文件:

  1. import pymysql
  2. connect = pymysql.Connect(host='localhost', port=3306,user='root',passwd='123123',db='database',charset='utf8') #连接数据库
  3. cursor = connnect.cursor()
  4. sql = "SELECT id,name FROM demo WHERE id = 2 " # sql语句
  5. cursor.execute(sql)
  6. result = cursor.fetchone() # 查看查询结果

编程要求

message表结构与数据如下:

列名说明类型
id表id(自动递增,主键)int
provincename省名varchar
cityname省会名varchar
ct用户数量int

Begin-End区域内进行代码补充,具体任务如下:

  • 首先完成config.py文件,实现对数据库的连接,数据库名为webMysql用户名为root,密码为123123
  • 完成models.py文件实现表模型的创建;
  • 完成test.py文件实现查询根据用户数量降序排序之后的结果,降序可以使用DESC方法。

提示:在代码栏左上角可以更换代码文件:


开始你的任务吧,祝你成功!

头歌实验代码

class Config(object):#连接数据库# ********* Begin *********#SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123123@localhost:3306/web" SQLALCHEMY_TRACK_MODIFICATIONS = True# ********* End *********#
from app import db
class Message(db.Model):#表模型#********* Begin *********#id = db.Column(db.Integer,primary_key=True)ct = db.Column(db.Integer)provincename = db.Column(db.String(255))cityname = db.Column(db.String(255))#********* End *********#

from app import db,app
from models import Message
from flask import render_template
@app.route("/select")
def select():# ********* Begin *********#pro = Message.query.order_by(Message.ct.desc()).all()city = list(map(lambda x: x.cityname, pro))count = list(map(lambda x: x.ct, pro))province = list(map(lambda x: x.provincename, pro))# ********* 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关 增加操作

本关任务:通过Flask连接Mysql数据库,并对数据库进行增加数据操作,完成编程要求的任务。

相关知识

不使用SQLAlchemy实现

demo表添加一条数据,只需要更改test.py文件:

  1. import pymysql
  2. connect = pymysql.Connect(host='localhost', port=3306,user='root',passwd='123123',db='database',charset='utf8')
  3. cursor = connect.cursor()
  4. sql = "INSERT INTO (id, name) VALUES (%d, '%s')" # sql语句
  5. data = (10,"Y")
  6. cursor.execute(sql,data)
  7. connect.commit()

使用SQLAlchemy

因为数据库没有变化,所以只需要更改test.py文件,其它文件配置与第一关相同:

  1. from app import db
  2. from models import Demo
  3. # 增加数据
  4. u = Demo(id=4, name="D") #参数对应表模型中的对象
  5. db.session.add(u)
  6. db.session.commit() #提交事项

编程要求

提示:数据库表信息同第一关。

message表结构:

列名说明类型
id表id(自动递增,主键)int
provincename省名varchar
cityname省会名varchar
ct用户数量int

 代码补充,具体任务如下:

  • 按照要求完成config.py文件的连接数据库以及models.py文件表模型的创建;
  • test.py文件中使用request.form()获取POST请求的表单数据(后台会自动发送一个POST请求,表单内容为纽约州 纽约市 1205);
  • 将获取下来的数据添加到数据库中。

测试说明

点击测评,平台会部署你的应用,并测试你的程序,尝试访问你编写的insert()方法。

预期输出:

  1. id provincename cityname ct
  2. 39 纽约州 纽约市 1205
  3. 38 湖南省 长沙市 1999
  4. 36 湖南省 株洲市 123
  5. 34 澳门 澳门 1894
  6. 33 新疆维吾尔自治区 乌鲁木齐 1808
  7. 32 青海省 西宁市 1890
  8. 31 湖北省 武汉市 1851
  9. 30 广东省 广州市 1911
  10. 29 浙江省 杭州市 1905
  11. 28 台湾省 台北市 1820
  12. 27 福建省 福州市 1874
  13. 26 河北省 石家庄市 1841
  14. 25 吉林省 长春市 1867
  15. 24 四川省 成都市 1861
  16. 23 湖南省 株洲市 1924
  17. 22 云南省 昆明市 1850
  18. 21 河南省 郑州市 1787
  19. 20 贵州省 贵阳市 1814
  20. 19 上海市 上海市 1955
  21. 18 重庆市 重庆市 1821
  22. 17 江苏省 南京市 1884
  23. 16 山东省 济南市 1864
  24. 15 宁夏回族自治区 银川 1886
  25. 14 甘肃省 兰州市 1883
  26. 13 香港 九龙 1877
  27. 12 天津市 天津市 1816
  28. 11 北京市 北京市 1826
  29. 10 安徽省 合肥市 1848
  30. 9 西藏自治区 拉萨 1830
  31. 8 海南省 海口市 1919
  32. 7 陕西省 西安市 1816
  33. 6 山西省 太原市 1886
  34. 5 江西省 南昌市 1898
  35. 4 广西壮族自治区 南宁 1841
  36. 3 黑龙江省 哈尔滨市 1863
  37. 2 辽宁省 沈阳市 1864
  38. 1 内蒙古自治区 呼和浩特 1903

头歌实验代码

class Config(object):#连接数据库###### Begin ######SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123123@localhost:3306/web?charset=utf8" SQLALCHEMY_TRACK_MODIFICATIONS = True###### End ######
from app import db
class Message(db.Model):#表模型###### Begin ######id = db.Column(db.Integer, primary_key=True)ct = db.Column(db.Integer)provincename = db.Column(db.String(255))cityname = db.Column(db.String(255))###### End ######

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 ********* #province = request.form['province']city = request.form['city']number = request.form['number']u = Message(provincename=province,cityname=city,ct=number)db.session.add(u)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关 删除操作

本关任务:通过Flask连接Mysql数据库,并对数据库进行删除数据操作。

相关知识

不使用SQLAlchemy实现

demo表删除一条数据,只需要修改test.py文件:

  1. import pymysql
  2. connect = pymysql.Connect(host='localhost', port=3306,user='root',passwd='123123',db='database',charset='utf8') #连接数据库
  3. cursor = connnect.cursor()
  4. sql = "DELETE FROM trade WHERE name = 'B'" # sql语句
  5. cursor.execute(sql)
  6. connect.commit()

使用SQLAlchemy

因为数据库没有变化,所以只需要更改test.py文件,其它文件配置与第一关相同:

  1. from app import db
  2. from models import Demo
  3. # 删除数据
  4. u2 = Demo.query.filter_by(name='D').first() #先定位到删除数据的那一行
  5. db.session.delete(u2)
  6. db.session.commit()

使用 request 获取 get 请求的参数

使用requestargs方法即可获取get请求提交的参数。
示例:

  1. @app.route("/demo",methods=['GET'])
  2. def demo():
  3. info = request.args.get("info") #获取get请求的info参数

编程要求

提示:数据库表信息同第一关

message表结构:

列名说明类型
id编号(自动递增,主键)int
provincename省名varchar
cityname省会名varchar
ct用户数量int

编写代码完成删除功能,根据方法内的提示,在Begin-End区域内进行代码补充。

测试说明

点击测评,平台会部署你的服务器,并尝试调用你补全的delete()方法,传入参数为 id = 1

预期输出: 成功删除id1的记录则算通关

  1. id provincename cityname ct
  2. 2 辽宁省 沈阳市 1864
  3. 3 黑龙江省 哈尔滨市 1863
  4. 4 广西壮族自治区 南宁 1841
  5. 5 江西省 南昌市 1898
  6. 6 山西省 太原市 1886
  7. 7 陕西省 西安市 1816
  8. 8 海南省 海口市 1919
  9. 9 西藏自治区 拉萨 1830
  10. 10 安徽省 合肥市 1848
  11. 11 北京市 北京市 1826
  12. 12 天津市 天津市 1816
  13. 13 香港 九龙 1877
  14. 14 甘肃省 兰州市 1883
  15. 15 宁夏回族自治区 银川 1886
  16. 16 山东省 济南市 1864
  17. 17 江苏省 南京市 1884
  18. 18 重庆市 重庆市 1821
  19. 19 上海市 上海市 1955
  20. 20 贵州省 贵阳市 1814
  21. 21 河南省 郑州市 1787
  22. 22 云南省 昆明市 1850
  23. 23 湖南省 株洲市 1924
  24. 24 四川省 成都市 1861
  25. 25 吉林省 长春市 1867
  26. 26 河北省 石家庄市 1841
  27. 27 福建省 福州市 1874
  28. 28 台湾省 台北市 1820
  29. 29 浙江省 杭州市 1905
  30. 30 广东省 广州市 1911
  31. 31 湖北省 武汉市 1851
  32. 32 青海省 西宁市 1890
  33. 33 新疆维吾尔自治区 乌鲁木齐 1808
  34. 34 澳门 澳门 1894
  35. 36 湖南省 株洲市 123
  36. 38 湖南省 长沙市 1999

头歌实验代码

from app import db,app
from models import Message
from flask import render_template,redirect,request
@app.route("/delete",methods=['GET'])
def delete():#操作数据库得到目标数据,before_number表示删除之前的数量,after_name表示删除之后的数量# ********* Begin *********#id = request.args.get("id")message = Message.query.filter_by(id=id).first()db.session.delete(message)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)

第4关 修改操作

本关任务:通过Flask连接Mysql数据库,并对数据库进行修改数据操作。

相关知识

不使用SQLAlchemy实现

demo表修改一条数据,只需要修改test.py文件:

  1. import pymysql
  2. connect = pymysql.Connect(host='localhost', port=3306,user='root',passwd='123123',db='database',charset='utf8') #连接数据库
  3. cursor = connect.cursor()
  4. sql = "UPDATE demo SET id=10 WHERE name = 'A'" # sql语句
  5. cursor.execute(sql,data)
  6. connect.commit()

使用SQLAlchemy

因为数据库没有变化,所以只需要更改test.py文件,其它文件配置与第一关相同:

  1. from app import db
  2. from models import Demo
  3. # 删除数据
  4. u1 = Demo.query.filter_by(name='A').first() #定位到name='A'的行
  5. u1.id = 10 #将这一行的id改为10
  6. db.session.commit()

获取POST请求提交的参数

在 Flask 中通过 request 对象可以获取,例如一个登陆方法中需要获取前端表单使用POST请求提交的用户名和密码数据。

  1. from flask import request
  2. @app.route("/alter",methods=['POST'])
  3. def login():
  4. #接收参数,修改数据
  5. # ********* Begin *********#
  6. username = request.form["username"]
  7. password = request.form['password']

编程要求

提示:数据库表信息同第一关,数据库名为web

message表结构:

列名说明类型
id表id(自动递增,主键)int
provincename省名varchar
cityname省会名varchar
ct用户数量int

使用普通**sql**语句完成任务,在Begin-End区域内进行代码补充,具体任务如下:

  • 首先使用request.form()获取表单数据中的idprovincenamecitynamectid是不可以修改的;
  • 使用sql语句将湖南省的省会改为长沙市。

测试说明

点击测评,平台会部署你的web应用,并尝试调用更新方法,将内蒙古呼和浩特市的用户数修改为10万。

预期输出:

  1. (1, '内蒙古自治区', '呼和浩特', 100000)
  2. (2, '辽宁省', '沈阳市', 1864)
  3. (3, '黑龙江省', '哈尔滨市', 1863)
  4. (4, '广西壮族自治区', '南宁', 1841)
  5. (5, '江西省', '南昌市', 1898)
  6. (6, '山西省', '太原市', 1886)
  7. (7, '陕西省', '西安市', 1816)
  8. (8, '海南省', '海口市', 1919)
  9. (9, '西藏自治区', '拉萨', 1830)
  10. (10, '安徽省', '合肥市', 1848)
  11. (11, '北京市', '北京市', 1826)
  12. (12, '天津市', '天津市', 1816)
  13. (13, '香港', '九龙', 1877)
  14. (14, '甘肃省', '兰州市', 1883)
  15. (15, '宁夏回族自治区', '银川', 1886)
  16. (16, '山东省', '济南市', 1864)
  17. (17, '江苏省', '南京市', 1884)
  18. (18, '重庆市', '重庆市', 1821)
  19. (19, '上海市', '上海市', 1955)
  20. (20, '贵州省', '贵阳市', 1814)
  21. (21, '河南省', '郑州市', 1787)
  22. (22, '云南省', '昆明市', 1850)
  23. (23, '湖南省', '株洲市', 1924)
  24. (24, '四川省', '成都市', 1861)
  25. (25, '吉林省', '长春市', 1867)
  26. (26, '河北省', '石家庄市', 1841)
  27. (27, '福建省', '福州市', 1874)
  28. (28, '台湾省', '台北市', 1820)
  29. (29, '浙江省', '杭州市', 1905)
  30. (30, '广东省', '广州市', 1911)
  31. (31, '湖北省', '武汉市', 1851)
  32. (32, '青海省', '西宁市', 1890)
  33. (33, '新疆维吾尔自治区', '乌鲁木齐', 1808)
  34. (34, '澳门', '澳门', 1894)
  35. (36, '湖南省', '株洲市', 123)
  36. (38, '湖南省', '长沙市', 1999)

头歌实验代码 

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 *********#id = request.form["id"]province = request.form['province']city = request.form['city']number = request.form['number']message = Message.query.filter_by(id = id).first()message.provincename = provincemessage.cityname = citymessage.ct = numberdb.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)

这篇关于数据库开发中级案例—PythonWeb框架应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/623062

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in