Flask Web开发基础:数据库与ORM实战
Flask Web开发基础:数据库与ORM实战
该文介绍了如何使用 Flask、SQLAlchemy 和 SQLite 实现数据库操作。首先,通过创建虚拟环境和安装 flask-sqlalchemy(版本2.5.1)及 sqlalchemy(版本1.4.47)来设置环境。接着,配置数据库URI,定义User和Movie模型类表示数据库表,并通过db.create_all()创建表。文章还展示了如何插入、查询、更新和删除记录,强调了db.session.commit()在保存更改中的关键作用。查询涉及filter、order_by等方法,提供了一系列示例。
以 sqlite + SQLAlchemy 为案例,基于 flask 完成对数据库的连接、操作数据库、操作表记录。
使用 SQLAlchemy 操作数据库
SQLAlchemy——一个 Python 数据库工具(ORM,即对象关系映射)。
通过定义模型类(python代码的类)来表示数据库的表,flask 有很多第三方扩展,选择 flask-sqlalchemy
扩展集成 SQLAlchemy
安装环境
mkdir 3-flask-db-sqlalchemy
#创建虚拟环境
python -m venv venv
#激活虚拟环境
./venv/Scripts/activate
安装依赖
要同时安装 flask-sqlalchemy 和 sqlalchemy
pip install flask==2.3.3
pip install flask-sqlalchemy==2.5.1 sqlalchemy==1.4.47
提示 Flask-SQLAlchemy 3.x / SQLAlchemy 2.x 版本有一些大的变化,所以这里固定安装 2.5.1 和 1.4.47 版本。
配置数据库并初始化
数据库 URI: sqlite 的绝对路径,根目录下/data.db
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import sqlalchemy as sa
import os
import sysWIN= sys.platform.startswith("win")
if WIN:prefix = "sqlite:///"
else:prefix = "sqlite:" app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = prefix + os.path.join(app.root_path , 'data.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭对模型修改的监控# 在扩展类实例化前加载配置
db = SQLAlchemy(app)
定义数据库模型
db 是前一步实例化的变量。由于db.Column
db.Integer
没有提示,改为手动引入 sqlalchemy 。
import sqlalchemy as sa
class User(db.Model):id = sa.Column(sa.Integer, primary_key=True) # 主键name = sa.Column(sa.String(20)) # 名字class Movie(db.Model):id = sa.Column(sa.Integer, primary_key=True) # 主键title = sa.Column(sa.String(60)) # 电影标题year = sa.Column(sa.String(4)) # 电影年份
-
模型类要声明继承
db.Model
-
在
db.Column()
中添加额外的选项(参数)可以对字段进行设置。比如,primary_key
设置当前字段是否为主键。除此之外,常用的选项还有nullable
(布尔值,是否允许为空值)、index
(布尔值,是否设置索引)、unique
(布尔值,是否允许重复值)、default
(设置默认值)等。 -
每一个类属性(字段)要实例化
db.Column
,传入的参数为字段的类型,下面的表格列出了常用的字段类。字段类 说明 db.Integer 整型 db.String (size) 字符串, size
为最大长度,例如db.String(20)
db.Text 长文本 db.DateTime 时间日期,Python datetime
对象db.Float 浮点数 db.Boolean 布尔值
数据库操作
创建数据库
db.create_all() #如果没有就,创建数据库表,有的话就不执行
更新表结构
注意:
drop_all()
会删除所有数据
#你改动了模型类,想重新生成表模式,需要先执行删除,再创建。
db.drop_all() #注意:会删除所有数据
db.create_all()
表记录插入
分为三个步骤
-
创建记录
-
添加到会话
-
提交会话
User
Movie
为上面建立的模型类
user = User(name='Grey Li') # 创建一个 User 记录
m1 = Movie(title='Leon', year='1994') # 创建一个 Movie 记录
m2 = Movie(title='Mahjong', year='1996') # 再创建一个 Movie 记录
db.session.add(user) # 把新创建的记录添加到数据库会话
db.session.add(m1)
db.session.add(m2)
db.session.commit() # 提交数据库会话,只需要在最后调用一次即可
提示 在实例化模型类的时候,我们并没有传入
id
字段(主键),因为 SQLAlchemy 会自动处理这个字段。
最后一行 db.session.commit()
很重要,只有调用了这一行才会真正把记录提交进数据库,前面的 db.session.add()
调用是将改动添加进数据库会话(一个临时区域)中。
表记录查询
查询语句语法
<模型类>.query.<过滤方法(可选)>.<查询方法>
过滤方法
过滤方法 | 说明 |
---|---|
filter() | 使用指定的规则过滤记录,返回新产生的查询对象 |
filter_by() | 使用指定规则过滤记录(以关键字表达式的形式),返回新产生的查询对象 |
order_by() | 根据指定条件对记录进行排序,返回新产生的查询对象 |
group_by() | 根据指定条件对记录进行分组,返回新产生的查询对象 |
查询方法
查询方法 | 说明 |
---|---|
all() | 返回包含所有查询记录的列表 |
first() | 返回查询的第一条记录,如果未找到,则返回 None |
get(id) | 传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回 None |
count() | 返回查询结果的数量 |
first_or_404() | 返回查询的第一条记录,如果未找到,则返回 404 错误响应 |
get_or_404(id) | 传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回 404 错误响应 |
paginate() | 返回一个 Pagination 对象,可以对记录进行分页处理 |
User
Movie
为上面建立的模型类
movie = Movie.query.first() # 获取 Movie 模型的第一个记录(返回模型类实例)
print(movie.title)
Movie.query.all() # 获取 Movie 模型的所有记录,返回包含多个模型类实例的列表
Movie.query.count() # 获取 Movie 模型所有记录的数量
Movie.query.get(1) # 获取主键值为 1 的记录
Movie.query.filter_by(title='Mahjong').first() # 获取 title 字段值为 Mahjong 的记录
Movie.query.filter(Movie.title=='Mahjong').first() # 等同于上面的查询,但使用不同的过滤方法
提示 我们在说 Movie 模型的时候,实际指的是数据库中的 movie 表。表的实际名称是模型类的小写形式(自动生成),如果你想自己指定表名,可以定义
__tablename__
属性。
对于最基础的 filter()
过滤方法,SQLAlchemy 支持丰富的查询操作符,具体可以访问文档相关页面查看。除此之外,还有更多的查询方法、过滤方法和数据库函数可以使用,具体可以访问文档的 Query API 部分查看。
表记录更新
movie = Movie.query.get(2)
movie.title = 'WALL-E' # 直接对实例属性赋予新的值即可
movie.year = '2008'
db.session.commit() # 注意仍然需要调用这一行来提交改动
表记录删除
movie = Movie.query.get(1)
db.session.delete(movie) # 使用 db.session.delete() 方法删除记录,传入模型实例
db.session.commit() # 提交改动
相关文章:
Flask Web开发基础:数据库与ORM实战
Flask Web开发基础:数据库与ORM实战 该文介绍了如何使用 Flask、SQLAlchemy 和 SQLite 实现数据库操作。首先,通过创建虚拟环境和安装 flask-sqlalchemy(版本2.5.1)及 sqlalchemy(版本1.4.47)来设置环境。接…...
pidstat -d 1分析磁盘吞吐量
iostat -dx 1 查看磁盘IO吞吐量 pidstat -d 1看是哪个进程写的...
期望20K,2年golang深圳某互联网小公司一面
后续约了二面(CTO面),需要到现场,基本没问啥具体的技术知识,都是聊规划和个人职业目标 一面 1、假设访问百度网站,从在浏览器输入网址,到最终页面展示出来,中间会发生哪些事情&…...
#02 安装指南:如何配置Stable Diffusion环境
文章目录 前言前置条件第1步:安装Python和PIP第2步:创建虚拟环境第3步:安装PyTorch和CUDA第4步:安装Stable Diffusion相关库第5步:测试环境结论 前言 在之前的文章中,我们介绍了Stable Diffusion基础入门和…...
拼多多笔试
拼多多2022数据分析笔试(0822) 一、选择题 1.已知样本量n,样本均值及方差求置信区间 2.决策树 3.峰度系数 4.协方差 5.第一、第二熵变 6.充分统计量 7.xgboost 8.方差分析中的多重比较 二、编程题 1. 一张用户点击路径的表&#x…...
Golang | Leetcode Golang题解之第119题杨辉三角II
题目: 题解: func getRow(rowIndex int) []int {row : make([]int, rowIndex1)row[0] 1for i : 1; i < rowIndex; i {row[i] row[i-1] * (rowIndex - i 1) / i}return row }...
Flutter 中的 SliverIgnorePointer 小部件:全面指南
Flutter 中的 SliverIgnorePointer 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它提供了一系列的组件来帮助开发者构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的滚动组件中,SliverIgnorePointer 是一个用来包…...
比较两台计算机上的LabVIEW、工具包及驱动程序的一致性
比较两台计算机上的LabVIEW、工具包及驱动程序是否相同,可以通过以下步骤实现: 1. 检查LabVIEW版本 方法一:在LabVIEW中查看版本信息 步骤: 打开LabVIEW。点击菜单栏的 Help > About LabVIEW。记录显示的LabVIEW版本号和许可…...
参考——温湿度传感器DHT11驱动_STM32
设备:stm32f407ZGT6 环境:FreeRTOS HAL 到网上找DHT11的驱动,但是都无法使用。原因是RTOS环境中,由于多线程,使用循环计数阻塞式的delay_us延时函数就没那么准,且不同设备中delay_us的计数值不一样…...
架构每日一学 14:架构师如何进行可行性探索?
架构活动中,如果不进行可行性探索可能会导致重大失误,为企业发展带来风险。 可行性探索是架构活动的最后一个节点,在这之后的架构活动就像是离弦之箭,即便发现重大风险也很难再回头了。 互联网公司之间的竞争非常激烈࿰…...
多线程知识-13
为什么应该在循环中检查等待条件 为了实现多线程的同步和协调,通常使用等待和唤醒机制。在等待和唤醒机制中,等待条件是指一个线程等待某个条件的满足,当条件满足时,线程被唤醒继续执行。 在循环中检查等待条件的目的是为了避免虚…...
vue3+cli-service配置代理,跨域请求
一、配置代理端口和代理转发 在vue.config.js文件中 const {defineConfig} require(vue/cli-service)module.exports defineConfig({devServer: {host: 0.0.0.0,port: 8088, // 启动端口号proxy: {/api: { // 请求接口中要替换的标识target: , // 代理地址,后…...
git介绍、安装、配置
文章目录 1. GIT介绍2. 使用GIT的好处3. GIT 安装4. GIT 配置4.1 GIT 初始化设置、命令别名设置4.2 如果终端安装了oh-my-zsh,会带一堆git命令别名4.3 GIT配置文件介绍4.3.1 Linux、Mac OS系统4.3.2 windows系统 5. git设置远程仓库账号密码(拉取、上传代码不用输入…...
打开flutter调试
debugPaintSizeEnabled true; debugPaintBaselinesEnabled true;...
【前端 - Vue】Vuex基础入门,创建仓库的详细步骤
🚀 个人简介:6年开发经验,现任职某国企前端负责人,分享前端相关技术与工作常见问题~ 💟 作 者:前端菜鸟的自我修养❣️ 📝 专 栏:vue从基础到起飞 🌈 若有帮助&…...
#01 Stable Diffusion基础入门:了解AI图像生成
文章目录 前言什么是Stable Diffusion?Stable Diffusion的工作原理如何使用Stable Diffusion?Stable Diffusion的应用场景结论 前言 在当今迅速发展的人工智能领域,AI图像生成技术以其独特的魅力吸引了广泛的关注。Stable Diffusion作为其中的一项前沿技术&#…...
Knife4j使用
Knife4j使用 文章目录 Knife4j使用1、Knife4j介绍2、SpringBoot集成Knife4j3、基本使用 1、Knife4j介绍 Knife4j是一个用于生成和展示API文档的工具,同时它还提供了在线调试的功能,可以看作是Swagger的升级版,界面也比Swagger更好看…...
一文读懂银行承兑汇票:从申请到使用全攻略
银行承兑汇票(Banks Acceptance Bill,BA)是商业汇票的一种。它是由在承兑银行开立存款账户的存款人出票,向开户银行申请并经银行审查同意承兑的,保证在指定日期无条件支付确定的金额给收款人或持票人的票据。银行承兑汇…...
唯众智联网(AIoT)应用开发教学实训解决方案
一、引言 随着信息技术的飞速发展,物联网(IoT)和人工智能(AI)技术逐渐融合,形成了智联网(AIoT)这一新兴领域。智联网通过智能化设备、传感器、云计算等技术手段,实现了数…...
归纳跨域几种解决方案
什么是跨域? **说起跨域,就要知道什么是浏览器同源策略 **浏览器同源策略:必须是协议、域名、端口完全一致的才符合同源策略 **如果以上三项,有一项不同都涉及到跨域问题 为什么浏览器要设置同源策略呢? 没有同源策…...
LeetCode刷题第3题(C#)
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。 法一: 这道题用到的其实是滑动窗口。 滑动窗口算法是在特定窗口大小的数组或字符串上执行要求的操作。它可以将一部分问题中的嵌套循环转变为一个单循环,以此减少时间复…...
了解一下Ubuntu Linux
1.3.1 什么是Ubuntu Ubuntu这个名字非常神奇,它取自非洲南部祖鲁语的ubuntu,是一个哲学名称,其意思为“人性”或者“我的存在是因为大家的存在”。对于中国人来说,一般称呼它为乌班图。 Ubuntu是在Debian的基础上开发出来的&am…...
单一原则+干湿分离,让你的架构能力起飞
# 概念 软件单一原则(Single Responsibility Principle,SRP)是面向对象编程中五大基本设计原则之一。它指每个软件模块或类都应该只负责一个单一的功能或责任。 高内聚低耦合 实现代码可维护性 干湿分离是一种建筑设计和室内装修的方法,主…...
如何恢复永久删除的照片?
“嗨,我永久删除了电脑上的很多照片。回收站被清空,照片会永久丢失吗?有什么方法可以恢复这些已删除的照片吗? 我们所有人都经历过同样的事情:我们的硬盘上存储了文件、视频或照片,但不小心删除了它。这个…...
一文看懂llama2(原理模型训练)
自从Transformer架构问世以来,大型语言模型(Large Language Models, LLMs)以及AIGC技术的发展速度惊人,它们不仅在技术层面取得了重大突破,还在商业应用、社会影响等多个层面展现出巨大潜力。随着ChatGPT的推出&#x…...
Sui基金会公布2024年3–4月资助项目名单
Sui基金会宣布3月和4月的资助项目名单,在这两个月中,共有10个项目获得了资助,以加速Sui的整合和发展。其中有八个项目专注于为开发者创造更好的体验,从开发强大的集成开发环境(IDE)到使用零知识证明保护用户…...
Spring Security3.0.1版本
前言: 抽象Spring Security3.0上一篇 在上一篇中,我们完成了对Security导入,快速入门,和对自动配置的简单验证 对登录流程的分析和Security基本原理 补充: 先解决上一篇留下的问题,端口和端点的区别 端…...
网络报文协议头学习
vxlan:就是通过Vxlan_header头在原始报文前面套了一层UDPIP(4/6)Eth_hdr 需求背景:VXLAN:简述VXLAN的概念,网络模型及报文格式_vxlan报文格式-CSDN博客 如果服务器作为VTEP,那从服务器发送到接…...
颜色与纹理
1 将非坐标数据传入顶点着色器 当执行gl.drawArrays()函数时,存储在缓冲区对象中的数据将按照其在缓冲区中的顺序依次传给对应的attribute变量。在顶点着色器中,我们将这两个attribute变量分别赋值给的gl_Position和gl_PointSize,就在指定的位置绘制出指定大小的点了。 1.…...
pytest-playwright 插件的使用
引言 在自动化测试领域,Playwright 是一个强大的工具,它支持 Chromium、Firefox 和 WebKit 三大浏览器引擎。Playwright 提供了与 Pytest 集成的插件,使得编写端到端测试变得更加简单和高效。本文将介绍如何使用 Pytest Playwright 插件来编…...
武汉近期重大新闻/朝阳seo搜索引擎
匿名用户1级2018-11-14 回答evalfis函数,模糊控制%被控系统建模num20;den[1.6,4.4,1];[a1,b,c,d]tf2ss(num,den);x[0;0];%T0.01;hT;N250;R1.5*ones(1,N);%参考输入%定义输入和输出变量及隶属度函数anewfis(simple);aaddvar(a,input,e,[-6 6]);aaddmf(a,input,1,NB,trapmf,[-6,-…...
手机网站优化需要注意什么/腾讯nba新闻
本文为原创,如需转载,请注明作者和出处,谢谢! 指针类型是C、Pascal等语言中比较重要的数据类型。在使用上很灵活。在C中可以使用如下的语句一个int指针类型:int*p;如果要为指针变量赋值,可以使用如下的语句…...
p2p网站制作/seo排名点击工具
本周带来了关于响应断言的问题,具体如下: 假设有一个登录的接口,在post请求中传递两个参数,分别是username、password、code 第一种场景:username不存在;响应错误码为2000 第二种场景:password错…...
郑州建设网站/易搜搜索引擎
百度百科: 哈夫曼树也可以是k叉的,只是在构造k叉哈夫曼树时需要先进行一些调整。构造哈夫曼树的思想是每次选k个权重最小的元素来合成一个新的元素,该元素权重为k个元素权重之和。但是当k大于2时,按照这个步骤做下去可能到最后剩…...
电商网站开发公司/国外网站如何搭建网页
前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010OpenCV2.4.4,OpenCV的环境配置网上有很多,不再赘述。检测的代码网上很多,记不清楚从哪儿copy的了,识别的代码是从OpenCV官网上找到的&…...
运城做网站的公司/培训机构哪家最好
实验二十八:TFT模块 - 触屏 读者在上一个实验所玩弄过的 TFT LCD模块,除了显示大小为 320 240,颜色为16位RGB的图像信息以外,它还支持触屏。所谓触屏就是鼠标还有键盘以外的输入手段,例如现在流行平板还有智能手机&am…...