当前位置: 首页 > news >正文

Web 框架 Flask 快速入门(三)数据库-MySQL

课程地址:Python Web 框架 Flask 快速入门

文章目录

  • 数据库
    • 1、数据库的安装与配置
    • 2、数据库的简单使用——增删改
      • 1. 定义数据模型
      • 2. 增删改
    • 3、 关系引用——表的关联
    • 4、查询——通过SQLAlchemy扩展
    • 5、其他
      • 1. 数据模型的实现(疑惑)
    • 6、Bug记录
      • 1. 1045,"Access denied for user 'root'@'localhost' "(using password: YES)
      • 2. RuntimeError: Working outside of application context


数据库

1、数据库的安装与配置

这节用到flask的两个扩展,使用pip安装扩展就行

pip install flask-sqlalchemy
pip install flask-mysqldb

然而,扩展只是基于数据库的一个抽象工具,就是说它只能让你的数据库更好用,但它本身并不是数据库。在使用这两个扩展之前,你还需要安装一个MySQL数据库。

参考:MySQL数据库安装教程(详细)

按教程中的压缩包方法,反正我安装成功了,如果遇到问题,可以翻翻评论区试试。

完成安装和配置后,数据库本地服务的启动流程:

# 1.登录数据库:打开cmd,输入下面命令。成功后会显示一段Welcome的话
C:\Users\ThinkPad>mysql -u用户名 -p 密码
# 2. 创建数据库:如果创建过,可跳过
mysql> create database flask_sql_demo charset=utf8;
# 3. 启动已创建的数据库
mysql> use flask_sql_demo;

MySQL较常见的一些命令:

# 1. 显示所有表单名
mysql> show tables;
# 2. 查看一个表单的字段结构(数据字典)
mysql> desc 表单名;
# 3. 查看一个表单的内容
mysql> select * from 表单名;
# 4. 关闭数据库 --> 显示Bye
mysql> quit
# 5. 显示所有数据库
mysql> show databases;
# 6. 删除数据表
mysql> drop table 数据表名;
# 7. 删除数据库
mysql> drop database 数据库名;

2、数据库的简单使用——增删改

1. 定义数据模型

增删改的操作对象是数据表,所谓“定义数据模型”,应该就是定义表的结构。

运行代码前,并不需要在终端登录数据库,脚本中本身就会登录。在终端登录数据库可以方便查看数据库的状态。

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)# 配置数据库的地址,url结构为'mysql://用户名:密码@IP地址/数据库名'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:写你的密码@127.0.0.1/flask_sql_demo2'# 数据库实例
db = SQLAlchemy(app)'''
两张表
角色(管理员,普通用户)
用户(角色id)
'''# 数据库的模型,需要继承db.Model
class Role(db.Model):# 定义表名__tablename__ = 'roles'# 定义字段 --> db.Column表示是一个字段id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(16), unique=True)class User(db.Model):__tablename__ = 'users'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(16), unique=True)email = db.Column(db.String(32),unique=True)password = db.Column(db.String(32))# db.ForeignKey('roles.id'),表示是外键,表名.idrole_id = db.Column(db.Integer, db.ForeignKey('roles.id'))# -- main --
ctx = app.app_context()
ctx.push()
db.drop_all() # 删除旧表
db.create_all() # 创建新表
ctx.pop()

然后可以在终端使用mysql命令查看创建的表单

mysql> show tables;
+---------------------------+
| Tables_in_flask_sql_demo2 |
+---------------------------+
| roles                     |
| users                     |
+---------------------------+
2 rows in set (0.00 sec)

2. 增删改

Flask-SQLAlchemy的数据是有会话(Session)管理的,在增、删或修改操作后,都需要有一个提交步骤,然后变更才会在数据库中生效。

1、增加数据

ro1 = Role(name='admin')
db.session.add(ro1)
db.session.commit()

也可以批量添加提交数据

ro1 = Role(name='admin')
ro2 = Role(name='user')
db.session.add_all([ro1, ro2])
db.session.commit()

2、修改数据

ro1.name = 'other'
db.session.commit()

3、删除数据

db.session.delete(ro1)
db.session.commit()

3、 关系引用——表的关联

我们之前定义的表users中,有一个外键role_id,是关联到表roles的。如果要从表users中要得到一个用户的角色的名字,就只能先得到角色的id,然后拿着这个id再到roles表中去找角色的名字,就是说需要经过两次查询。

“关系引用”的

  • 作用:上述过程我只需要一次查询就可以得到用户的角色名。

  • 条件:需要是“一对多”的关系;例如很多用户有相同的角色名,但一个用户只能有一个角色名;这里角色名就是“一”,用户就是“多”。

  • 创建:在作为“一”的一方写关联。

创建roles表和users表之间的关联,我只需要修改类Role的定义就可以了。

class Role(db.Model):__tablename__ = 'roles'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(16), unique=True)# 在"一"的一方,写关联# Role表增加了一个users属性# backref='role':表示role也是User要用的属性(回关)users = db.relationship('User', backref='role')

关联的属性不会出现在数据库的表中,我们可以通过类名.属性名的方式来访问一个表的属性,例如

print(ro1.users)

输出的效果是这样子(下面的输出仅用于展示格式),它仅显示了类型和id,

[<User 1>, <User 2>]

如果我希望显示用户的具体信息,则需要在类的定义中加入__ref__方法,例如在类User中加入,

class User(db.Model):__tablename__ = 'users'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(16), unique=True)email = db.Column(db.String(32),unique=True)password = db.Column(db.String(32))role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))# 类的实例返回字符串def __repr__(self) -> str:return '<User: %s %s %s %s %s>' % (self.id, self.name, self.email, self.password, self.role_id)

则表的属性显示效果将是

[<User: 1 wang wang@123.com None 1>, <User: 2 zhang zhang@123.com None 1>]

4、查询——通过SQLAlchemy扩展

过滤器和执行器,过滤器仅对数据进行筛选,返回结果还需使用执行器。

查询users表中的所有对象

User.query.all()

查询users表中id为4的对象

# 1. 旧的,已弃用
User.query.get(4)
# 2. filter_by --> 属性=值
User.query.filter_by(id=4).first()
# 3. filter --> 类.属性==值; 更加灵活,支持比较运算符
User.query.filter(User.id==4).first()

5、其他

1. 数据模型的实现(疑惑)

感觉有些奇怪,在定义一个数据模型类时,我仅仅需要在类中定义一些变量,如__tablename__idname

class Role(db.Model):__tablename__ = 'roles'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(16), unique=True)

后面创建数据时就可以使用这些变量名作为关键字参数传参,

ro1 = Role(name='admin')

我不知道父类db.Model做了什么可以达到这样的效果,可能我python还是学得太浅了叭。

6、Bug记录

1. 1045,"Access denied for user ‘root’@‘localhost’ "(using password: YES)

当时我在cmd可以登录数据库,可当我运行python脚本时,就报出这个错误,查了许多文章都没有解决。后来有次在终端输错了密码发现也是报这个错误,于是发现是配置数据库地址的问题,

root:mysql中的mysql是密码,我还以为是固定的语法就照写了。

# 错误写法
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1/flask_sql_demo2'
# 修改
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:我的密码@127.0.0.1/flask_sql_demo2'

2. RuntimeError: Working outside of application context

发现脚本中对数据库的操作就会引发改问题,一个较方便的处理方式是

ctx = app.app_context()
ctx.push()
数据库操作
ctx.pop()

参考:解决Flask中RE

参考文章中还有一种使用with的上下文管理,也是可以哒。


相关文章:

Web 框架 Flask 快速入门(三)数据库-MySQL

课程地址&#xff1a;Python Web 框架 Flask 快速入门 文章目录数据库1、数据库的安装与配置2、数据库的简单使用——增删改1. 定义数据模型2. 增删改3、 关系引用——表的关联4、查询——通过SQLAlchemy扩展5、其他1. 数据模型的实现&#xff08;疑惑&#xff09;6、Bug记录1.…...

牛客网Python篇数据分析习题(六)

1.某公司计划举办一场运动会&#xff0c;现有运动会项目数据集items.csv。 包含以下字段&#xff1a; item_id&#xff1a;项目编号&#xff1b; item_name:项目名称&#xff1b; location:比赛场地。 有员工报名情况数据集signup.csv。包含以下字段&#xff1a; employee_id&a…...

Ansible的安装及部署

目录 一、Ansible对于企业运维的重大意义 二、Ansible的安装 三、构建Ansible清单 1.直接书写受管主机名或ip&#xff0c;每行一个 2.设定受管主机的组[组名称] 四、Ansible配置文件参数详解 1、配置文件的分类与优先级 2.配置新用户的Ansible配置 3.生成免密认证 本章…...

链表题目总结 -- 递归

目录一. 递归反转整个链表1. 思路简述2. 代码3. 总结二. 反转链表前 N 个节点1. 思路简述2. 代码3. 总结三、反转链表的一部分1. 思路简述2. 代码3.总结四、从节点M开始反转后面的链表1. 思路简述2. 代码3.总结一. 递归反转整个链表 题目链接&#xff1a;https://leetcode.cn/…...

重写-linux内存管理-伙伴分配器(一)

文章目录一、伙伴系统的结构二、初始化三、分配内存3.1 prepare_alloc_pages3.2 get_page_from_freelist3.2.1 zone_watermark_fast3.2.2 zone_watermark_ok3.2.3 rmqueue3.2.3.1 rmqueue_pcplist3.2.3.2 __rmqueue3.2.3.2.1 __rmqueue_smallest3.2.3.2.2 __rmqueue_fallback3.…...

为什么要用springboot进行开发呢?

文章目录前言1、那么Springboot是怎么实现自动配置的1.1 启动类1.2 SpringBootApplication1.3 Configuration1.4 ComponentScan1.5 EnableAutoConfiguration1.6 两个重要注解1.7 AutoConfigurationPackage注解1.8 Import(AutoConfigurationImportSelector.class)注解1.9自动配置…...

设备树信息解析相关函数

一。可以通过三种不同的方式解析设备树节点&#xff1a; 1.根据设备树节点的名字解析设备树节点 struct device_node *of_find_node_by_name(struct device_node *from, const char *name); 参数&#xff1a; from&#xff1a;当前节点父节点首地址 name:设备树节点名字 …...

LeetCode-1124. 表现良好的最长时间段【哈希表,前缀和,单调栈】

LeetCode-1124. 表现良好的最长时间段【哈希表&#xff0c;前缀和&#xff0c;单调栈】题目描述&#xff1a;解题思路一&#xff1a;查字典。cur是当前的前缀和(劳累与不劳累天数之差)&#xff0c;向前遍历。有两种情况。情况一&#xff0c;若cur大于0则是[0,i]的劳累与不劳累天…...

vue-router路由配置

介绍&#xff1a;路由配置主要是用来确定网站访问路径对应哪个文件代码显示的&#xff0c;这里主要描述路由的配置、子路由、动态路由&#xff08;运行中添加删除路由&#xff09; 1、npm添加 npm install vue-router // 执行完后会自动在package.json中添加 "vue-router…...

中国计算机设计大赛来啦!用飞桨驱动智慧救援机器狗

‍‍中国大学生计算机设计大赛是我国高校面向本科生最早的赛事之一&#xff0c;自2008年开赛至今&#xff0c;一直由教育部高校与计算机相关教指委等或独立或联合主办。大赛的目的是以赛促学、以赛促教、以赛促创&#xff0c;为国家培养德智体美劳全面发展的创新型、复合型、应…...

嘉定区2022年高新技术企业认定资助申报指南

各镇人民政府&#xff0c;街道办事处&#xff0c;嘉定工业区、菊园新区管委会&#xff0c;各相关企业&#xff1a; 为推进实施创新驱动发展战略&#xff0c;加快建设具有全球影响力的科技创新中心&#xff0c;根据《嘉定区关于加快本区高新技术企业发展的实施方案&#xff08;…...

【C++】关键字、命名空间、输入和输出、缺省参数、函数重载

C关键字(C98)命名空间产生背景命名空间定义命名空间使用输入&输出缺省参数什么叫缺省参数缺省参数分类函数重载函数重载概念C支持函数重载的原理--名字修饰C关键字(C98) C总计63个关键字&#xff0c;C语言32个关键字。 下面我们先看一下C有多少关键字&#xff0c;不对关键…...

【一道面试题】关于HashMap的一系列问题

HashMap底层数据结构在1.7与1.8的变化 1.7是基于数组链表实现的&#xff0c;1.8是基于数组链表红黑树实现的&#xff0c;链表长度达到8时会树化 使用哈希表的好处 使用hash表是为了提升查找效率&#xff0c;比如我现在要在数组中查找一个A对象&#xff0c;在这种情况下是无法…...

论文笔记: Monocular Depth Estimation: a Review of the 2022 State of the Art

中文标题&#xff1a;单目深度估计&#xff1a;回顾2022年最先进技术 本文对比了物种最近的基于深度学习的单目深度估计方法&#xff1a; GPLDepth(2022)[15]: Global-Local Path Networks for Monocular Depth Estimation with Vertical CutDepthAdabins(2021)[1]: Adabins:…...

Springmvc补充配置

Controller配置总结 控制器通常通过接口定义或注解定义两种方法实现 在用接口定义写控制器时&#xff0c;需要去Spring配置文件中注册请求的bean;name对应请求路径&#xff0c;class对应处理请求的类。 <bean id"/hello" class"com.demo.Controller.HelloCo…...

MySQL 的 datetime等日期和时间处理SQL函数及格式化显示

MySQL 的 datetime等日期和时间处理SQL函数及格式化显示MySQL 时间相关的SQL函数&#xff1a;MySQL的SQL DATE_FORMAT函数&#xff1a;用于以不同的格式显示日期/时间数据。DATE_FORMAT(date, format) 根据格式串 format 格式化日期或日期和时间值 date&#xff0c;返回结果串。…...

基于微信云开发的防诈反诈宣传教育答题小程序

基于微信云开发的防诈反诈宣传教育答题小程序一、前言介绍作为当代大学生&#xff0c;诈骗事件的发生屡见不鲜&#xff0c;但却未能引起大家的重视。高校以线上宣传、阵地展示为主&#xff0c;线下学习、实地送法为辅&#xff0c;从而构筑立体化反诈骗防线。在线答题考试是一种…...

Map和Set

Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。数据的一般查找方式有两种&#xff1a;直接遍历和二分查找。但这两种查找方式都有很大的局限性&#xff0c;也不便于对数据进行增删查改等操作。对于这一类数据的查找&…...

【位运算问题】Leetcode 136、137、260问题详解及代码实现

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…...

同花顺2023届春招内推

同花顺2023届春招开始啦&#xff01; 同花顺是国内首家上市的互联网金融信息服务平台&#xff0c;如果你对互联网金融感兴趣&#xff0c;如果你有志向在人工智能方向发挥所长&#xff0c;如果你也是一个激情澎湃的小伙伴&#xff0c;欢迎加入我们&#xff01;岗位类别&#xf…...

SecGPT-14B部署案例:中小企业安全运营中心(SOC)轻量化AI分析终端搭建

SecGPT-14B部署案例&#xff1a;中小企业安全运营中心&#xff08;SOC&#xff09;轻量化AI分析终端搭建 1. 项目背景与价值 在网络安全形势日益严峻的今天&#xff0c;中小企业安全运营中心&#xff08;SOC&#xff09;面临着专业人才短缺、分析工具昂贵、响应速度慢等痛点。…...

避坑指南:Trainer自定义数据顺序的两种解决方案对比(RandomSampler vs SequentialSampler)

深度解析&#xff1a;如何精准控制Transformer训练数据顺序的两种核心策略 在大型语言模型&#xff08;LLM&#xff09;的监督微调&#xff08;SFT&#xff09;过程中&#xff0c;数据输入顺序的控制往往被忽视&#xff0c;却可能对模型收敛速度和最终性能产生微妙影响。当我们…...

Phi-3-vision-128k-instruct开源可部署:轻量级多模态模型本地化部署完全指南

Phi-3-vision-128k-instruct开源可部署&#xff1a;轻量级多模态模型本地化部署完全指南 1. 模型简介 Phi-3-Vision-128K-Instruct 是一个轻量级的开放多模态模型&#xff0c;属于Phi-3模型家族的最新成员。这个模型特别之处在于它同时支持文本和视觉数据的处理&#xff0c;并…...

避坑指南:ESP32移植LVGL v8.3遇到的那些SPI配置坑(附解决方案)

ESP32深度实战&#xff1a;LVGL v8.3移植与ST7789屏幕SPI优化全解析 当一块240x320的ST7789屏幕在ESP32上成功点亮LVGL的music demo时&#xff0c;那种流畅的动画效果往往会让开发者误以为移植工作已经完成。直到项目进入压力测试阶段&#xff0c;才会发现SPI配置中隐藏的那些&…...

HTML5 Canvas贪吃蛇游戏开发实战:从零到可玩(附完整代码)

HTML5 Canvas贪吃蛇游戏开发实战&#xff1a;从零到可玩&#xff08;附完整代码&#xff09; 记得第一次接触贪吃蛇是在诺基亚3310上&#xff0c;那个像素风的小蛇让我着迷了好一阵子。如今作为前端开发者&#xff0c;用HTML5 Canvas重新实现这个经典游戏&#xff0c;既是对童年…...

从零开始理解相机坐标系转换:手把手教你搞定D435i深度测量

从零开始理解相机坐标系转换&#xff1a;手把手教你搞定D435i深度测量 水下机器人开发者小张最近遇到了一个棘手问题——他使用Intel RealSense D435i深度相机采集的数据在水下环境中总是出现明显偏差。当他试图测量一个1米长的标准物体时&#xff0c;系统返回的数值在0.85米到…...

SHAP可解释性分析避坑指南:分类与回归问题的维度处理

SHAP可解释性分析避坑指南&#xff1a;分类与回归问题的维度处理 在机器学习模型的黑盒世界里&#xff0c;SHAP值就像一束穿透迷雾的光&#xff0c;让我们得以窥见模型决策的内在逻辑。然而&#xff0c;当数据科学家们满怀期待地打开这个"可解释性工具箱"时&#xff…...

GLM-OCR入门教程:3步完成Ubuntu20.04环境部署与首次调用

GLM-OCR入门教程&#xff1a;3步完成Ubuntu20.04环境部署与首次调用 你是不是也遇到过这种情况&#xff1a;手头有一堆图片&#xff0c;里面全是文字信息&#xff0c;比如扫描的文档、截图的聊天记录&#xff0c;或者拍下来的白板内容。一个个手动敲键盘录入&#xff1f;太费时…...

通义千问2.5-7B实战案例:电商产品描述自动生成系统

通义千问2.5-7B实战案例&#xff1a;电商产品描述自动生成系统 1. 项目背景与价值 电商运营最头疼的事情是什么&#xff1f;每天要写几十上百个商品描述&#xff01;人工撰写不仅耗时耗力&#xff0c;还容易风格不统一。通义千问2.5-7B-Instruct的出现&#xff0c;让这个问题…...

WuliArt Qwen-Image Turbo场景应用:如何用它为你的PPT快速制作精美配图?

WuliArt Qwen-Image Turbo场景应用&#xff1a;如何用它为你的PPT快速制作精美配图&#xff1f; 1. 从“找图难”到“生成快”&#xff1a;PPT配图的新解法 你有没有过这样的经历&#xff1f;明天就要做工作汇报&#xff0c;PPT内容都写好了&#xff0c;就差几张能撑起场面的…...