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

Flask 使用Flask-SQLAlchemy操作数据库

username = db.Column(db.String(64), unique=True, index=True);

password = db.Column(db.String(64));

建立对应关系

如果是多对多关系就建一张表,关联两个表的id

role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id’))

‘’’

帮助作关联查询

relationship()把两个表关联在一起,不添加也是可以的,根据自己的需求

backref : 在关系的另一模型中添加反向引用

相当于给要关联的表添加一个role属性

不添加也是可以的,根据自己的需求

‘’’

rol = db.relationship(‘Role’, backref=‘use’)

db.Column类构造函数的第一个参数是数据库列和模型属性的类型。如下表是一些常用的列类型

| 类型名 | 说明 |

| — | — |

| Integer | 普通整数,一般是32位 |

| SmallInteger | 取值范围小的整数,一般是16位 |

| Float | 浮点数 |

| Numeric | 定点数 |

| String | 字符串 |

| Text | 文本字符串 |

| Boolean | 布尔值 |

| Date | 日期 |

| Time | 时间 |

| DateTime | 日期和时间 |

db.Column中其余的参数指定属性的配置选项,如下是一些可用的选项

| 选项名 | 说明 |

| — | — |

| primary_key | 如果设为True,这列就是表的主键 |

| unique | 如果设为True,唯一索引 |

| index | 如果设为True,为这列创建索引 |

| nullable | 如果设为True,允许为空值 |

| default | 为这列定义默认值 |

| autoincrement | 如果设为True,自动递增 |

常用的关系配置选项

| 选项名 | 说明 |

| — | — |

| backref | 在关系的另一个模型中添加反向引用 |

| order_by | 指定关系中记录的排序方式 |

| secondary | 指定多对多关系中关系表的名字 |

操作数据库

创建和删除表

表的模型创建好后,可以使用db.create_all()函数根据模型在数据库中创建对应的表。

根据类创建表

db.create_all()

删除所有表

db.drop_all()

增删改查

添加

创建两个添加数据的视图函数,一次可以添加一条或多条数据。

新增一条数据

@app.route(‘/add’)

def createOne():

构造模型,使用关键字参数指定的模型属性初始值

role = Role(name = “管理员1”);

把准备写入数据库的对象,先添加到会话中

db.session.add(role);

调用commit()方法提交会话,保存

db.session.commit();

return “添加成功!”;

添加多条数据

@app.route(“/adds”)

def createAll():

role = Role(name = “管理员2”);

roles = [

Role(name=“管理员3”),

Role(name=“管理员4”),

Role(name=“管理员5”)

]

db.session.add_all(roles);

db.session.add(role);

db.session.commit();

return “添加成功”

访问上述两个视图函数后,数据库中添加了对应的数据,如下所示:

在这里插入图片描述

上面给roles表中添加了五条数据,下面这个视图函数给users表添加一条数据,关联roles表。

添加用户表数据

@app.route(“/addUser”)

def addUser():

user = User(username = “admin1”, password=“admin”, role_id=6)

db.session.add(user);

db.session.commit();

return “添加成功”

上面视图函数中是直接给出的roles表中的id值的,开发中可以根据某一属性查询出roles某一条数据进行关联。访问视图函数后,效果如下:

在这里插入图片描述

查询全部结果

定义一个视图查询出roles表中的所有数据。

查询表中全部数据

@app.route(“/findAll”)

def findAll():

返回一个列表,all()函数返回所有结果

result = Role.query.all();

print(result)

for item in result:

print(item.id, item.name)

return “查询成功”

查询结果如下:

在这里插入图片描述

上述中查询使用了all()函数,返回查询的所有结果,下表是SQLAlchemy查询一些常用的函数。

| 方法 | 说明 |

| — | — |

| all() | 以列表形式返回查询的所有结果 |

| first() | 返回查询的第一个结果,如果没有结结果,则返回None |

| frist_or_404 | 返回查询的第一个结果,如果没有结果,则重则请求,返回404错误响应 |

| get() | 返回指定主键对应的行,如果没有对应的行,则返回None |

| get_or_404 | 返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回404错误响应 |

| count() | 返回查询结果的数量 |

| paginate() | 返回一个Paginate对象,它包含指定范围内的结果 |

根据条件查询

在上述查询全部数据中,使用filter进行条件查询

如下视图函数根据username属性查询。

根据用户名查询数据

@app.route(“/findByUsername/”)

def findByUsername(username):

filter过滤器,根据条件查询

obj = User.query.filter(User.username == username).all();

print(obj);

return “查询成功”;

在SQLAlchemy中除了filter过滤器还有一些其他的查询过滤器。如下

| 过滤器 | 说明 |

| — | — |

| filter() | 把过滤器添加到原查询上,返回一个新查询 |

| filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |

| limit() | 使用指定的值限制原查询返回的结果数量,返回一个新查询 |

| offset() | 偏移原查询返回的结果,返回一个新查询 |

| order_by() | 根据指定条件对原查询结果进行排序,返回一个新查询 |

| group_by() | 根据指定条件对原查询结果进行分组,返回一个新查询 |

删除

先根据id查询出需要参数的数据,在使用delete进行删除。

根据条件删除

@app.route(“/deleteById/”)

def deleteById(id):

根据id查询数据,filter条件查询

role = Role.query.filter(Role.id == id).first();

db.session.delete(role);

db.session.commit();

return “删除成功”;

修改

查询出表中的第一条数据,对其name属性进行修改,之后在保存。

修改

@app.route(“/update”)

def update():

role = Role.query.first();

role.name = “系统管理员”;

db.session.commit();

return “修改成功”

上述案例完整代码如下:

from flask import Flask

from flask_sqlalchemy import SQLAlchemy

app = Flask(name)

配置链接数据库信息

mysql://账号:密码@链接地址:端口/数据库名

app.config[‘SQLALCHEMY_DATABASE_URI’] = “mysql+pymysql://root:root@localhost:3306/flaskdemo”

设置是否跟踪数据库的修改情况

app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS’] = True

数据库操作时是否显示原始SQL语句,日志

app.config[‘SQLALCHEMY_ECHO’] = True

链接超时时间

app.config[‘SQLALCHEMY_POOL_TIMEOUT’] = 3000

实例SQLAlchemy类,use_native_unicode='utf8’设置编码,必须设置

db = SQLAlchemy(app, use_native_unicode=‘utf8’);

@app.route(‘/’)

def hello_world():

return ‘Hello World!’

定义Role和User两个类

class Role(db.Model):

定义表名

tablename = ‘roles’;

db.Column定义属性,db.Integer设置类型,

Primary_key = True设置主键

unique = True设置唯一索引

index = True创建索引,提示查询效率

nullable = True允许为空值

default为这列设置默认值

autoincrement = True自动递增

id = db.Column(db.Integer, primary_key=True, autoincrement=True)

name = db.Column(db.String(64), nullable=False)

定义一个User类

class User(db.Model):

tablename = ‘users’;

id = db.Column(db.Integer, primary_key=True, autoincrement=True);

username = db.Column(db.String(64), unique=True, index=True);

password = db.Column(db.String(64));

这一列的值为roles表中的id值

如果是多对多关系就建一张表,关联两个表的id

role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id’))

‘’’

帮助作关联查询

relationship()把两个表关联在一起,不添加也是可以的,根据自己的需求

backref : 在关系的另一模型中添加反向引用

相当于给要关联的表添加一个role属性

不添加也是可以的,根据自己的需求

‘’’

rol = db.relationship(‘Role’, backref=‘use’)

新增一条数据

@app.route(‘/add’)

def createOne():

构造模型,使用关键字参数指定的模型属性初始值

role = Role(name = “管理员1”);

把准备写入数据库的对象,先添加到会话中

db.session.add(role);

调用commit()方法提交会话

db.session.commit();

return “添加成功!”;

添加多条数据

@app.route(“/adds”)

def createAll():

role = Role(name = “管理员2”);

roles = [

Role(name=“管理员3”),

Role(name=“管理员4”),

Role(name=“管理员5”)

]

db.session.add_all(roles);

db.session.add(role);

db.session.commit();

return “添加成功”

查询表中全部数据

@app.route(“/findAll”)

def findAll():

返回一个列表

result = Role.query.all();

print(result)

for item in result:

print(item.id, item.name)

return “查询成功”

根据条件删除

@app.route(“/deleteById/”)

def deleteById(id):

根据id查询数据,filter条件查询

role = Role.query.filter(Role.id == id).first();

db.session.delete(role);

db.session.commit();

return “删除成功”;

修改

@app.route(“/update”)

def update():

role = Role.query.first();

role.name = “系统管理员”;

db.session.commit();

return “修改成功”

添加用户表数据

@app.route(“/addUser”)

def addUser():

user = User(username = “admin1”, password=“admin”, role_id=6)

db.session.add(user);

db.session.commit();

return “添加成功”

根据用户名查询数据

@app.route(“/findByUsername/”)

def findByUsername(username):

obj = User.query.filter(User.username == username).all();

print(obj);

return “查询成功”;

查询所有用户,不显示权限

@app.route(“/findUserAll”)

def findUserAll():

objs = User.query.all()

for obj in objs:

print(obj.id, obj.username, obj.password, obj.role_id);

return “查询成功”

查询所有用户,显示权限

@app.route(“/findUserAll1”)

def findUserAll1():

objs = User.query.all()

for obj in objs:

通过类中的relationship调用关联类的属性

print(obj.id, obj.username, obj.password, obj.rol.name);

相关文章:

Flask 使用Flask-SQLAlchemy操作数据库

username db.Column(db.String(64), uniqueTrue, indexTrue); password db.Column(db.String(64)); 建立对应关系 如果是多对多关系就建一张表,关联两个表的id role_id db.Column(db.Integer, db.ForeignKey(‘roles.id’)) ‘’’ 帮助作关联查询 relati…...

[EAI-023] FAST,机器人动作专用的Tokenizer,提高VLA模型的能力和训练效率

Paper Card 论文标题:FAST: Efficient Action Tokenization for Vision-Language-Action Models 论文作者:Karl Pertsch, Kyle Stachowicz, Brian Ichter, Danny Driess, Suraj Nair, Quan Vuong, Oier Mees, Chelsea Finn, Sergey Levine 论文链接&…...

使用Pygame制作“太空侵略者”游戏

1. 前言 在 2D 游戏开发中,“太空侵略者”是一款入门难度适中、却能覆盖多种常见游戏机制的项目: 玩家控制飞船(Player)左右移动,发射子弹。敌人(Enemy)排列成一行或多行,从屏幕顶…...

《逆向工程核心原理》第三~五章知识整理

查看上一章节内容《逆向工程核心原理》第一~二章知识整理 对应《逆向工程核心原理》第三章到第五章内容 小端序标记法 字节序 多字节数据在计算机内存中存放的字节顺序分为小端序和大端序两大类 大端序与小端序 BYTE b 0x12; WORD w 0x1234; DWORD dw 0x12345678; cha…...

2025 AI行业变革:从DeepSeek V3到o3-mini的技术演进

【核心要点】 DeepSeek V3引领算力革命,成本降至1/20o3-mini以精准优化回应市场挑战AI技术迈向真正意义的民主化行业生态正在深刻重构 一、市场格局演变 发展脉络 2025年初,AI行业迎来重要转折。DeepSeek率先发布V3模型,通过革命性的架构创…...

SAP SD学习笔记28 - 请求计划(开票计划)之2 - Milestone请求(里程碑开票)

上一章讲了请求计划(开票计划)中的 定期请求。 SAP SD学习笔记27 - 请求计划(开票计划)之1 - 定期请求-CSDN博客 本章继续来讲请求计划(开票计划)的其他内容: Milestone请求(里程碑请求)。 目录 1,Miles…...

算法随笔_27:最大宽度坡

上一篇:算法随笔_26: 按奇偶排序数组-CSDN博客 题目描述如下: 给定一个整数数组 nums&#xff0c;坡是元组 (i, j)&#xff0c;其中 i < j 且 nums[i] < nums[j]。这样的坡的宽度为 j - i。 找出 nums 中的坡的最大宽度&#xff0c;如果不存在&#xff0c;返回 0 。 …...

SpringBoot+Vue的理解(含axios/ajax)-前后端交互前端篇

文章目录 引言SpringBootThymeleafVueSpringBootSpringBootVue&#xff08;前端&#xff09;axios/ajaxVue作用响应式动态绑定单页面应用SPA前端路由 前端路由URL和后端API URL的区别前端路由的数据从哪里来的 Vue和只用三件套axios区别 关于地址栏url和axios请求不一致VueJSPS…...

大白话讲清楚embedding原理

Embedding&#xff08;嵌入&#xff09;是一种将高维数据&#xff08;如单词、句子、图像等&#xff09;映射到低维连续向量的技术&#xff0c;其核心目的是通过向量表示捕捉数据之间的语义或特征关系。以下从原理、方法和应用三个方面详细解释Embedding的工作原理。 一、Embe…...

2025年1月22日(网络编程 udp)

系统信息&#xff1a; ubuntu 16.04LTS Raspberry Pi Zero 2W 系统版本&#xff1a; 2024-10-22-raspios-bullseye-armhf Python 版本&#xff1a;Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习…...

【RAG】SKLearnVectorStore 避免使用gpt4all会connection err

gpt4all 列表中包含了多个开源的大模型,如 Qwen2.5、Llama 3、DeepSeek、Mistral 等,但 不包含 OpenAI 的 GPT-4o。GPT-4o 是 OpenAI 提供的闭源模型,目前只能通过 OpenAI API 或 ChatGPT 官方应用(网页版、移动端)访问,并不支持本地运行,也没有 GGUF 量化格式的模型文件…...

ios swift画中画技术尝试

继上篇&#xff1a;iOS swift 后台运行应用尝试失败-CSDN博客 为什么想到画中画&#xff0c;起初是看到后台模式里有一个picture in picture&#xff0c;去了解了后发现这个就是小窗口视频播放&#xff0c;方便用户执行多任务。看小窗口视频的同时&#xff0c;可以作其他的事情…...

Prometheus 中的 Exporter

在 Prometheus 生态系统中,Exporter 扮演着至关重要的角色,它们负责从不同的服务或系统中收集和暴露度量数据。本文将详细介绍 Exporter 的概念、类型以及如何有效使用它们将 Prometheus 集成到各种系统中进行监控。 什么是 Exporter? Exporter 是一段软件,它从应用程序或…...

玄奘的启示

今天没事&#xff0c;又看了一遍央视拍的《玄奘大师》&#xff08;程池、齐秦配乐版&#xff09;伪纪录片&#xff0c;很有感触。 古罗马哲学家塞内加说“人最可怕的事情莫过于死前只留下活过的岁数。” 他在《论生命之短暂》中这样写道&#xff1a;“生命并非短促&#xff0…...

车载以太网---数据链路层

在上一章节中&#xff0c;我们讲解了数据链路层与物理层的接口MIIM,在本章中我们主要介绍车载网络中的数据链路层。 目录 数据链路层与网络层的区别 数据链路层&#xff1a;负责“同一链路”或“局域网/子网”内的可靠传输 传输范围&#xff1a; 主要功能&#xff1a; 通路…...

文本复制兼容方案最佳实现落地。

文章目录 一、navigator.clipboard.writeText二、方案落地总结 一、navigator.clipboard.writeText navigator.clipboard.writeText 是一个Web API&#xff0c;它允许网页脚本将文本数据写入用户的系统剪贴板。这个API是异步的&#xff0c;并且设计用于提高安全性和用户体验&a…...

ArkTS高性能编程实践

文章目录 概述声明与表达式函数数组异常 概述 本文主要提供应用性能敏感场景下的高性能编程的相关建议&#xff0c;助力开发者开发出高性能的应用。高性能编程实践&#xff0c;是在开发过程中逐步总结出来的一些高性能的写法和建议&#xff0c;在业务功能实现过程中&#xff0…...

阿里新发的大模型Qwen2.5-max如何?

阿里新发布的大模型Qwen2.5-Max是一款性能卓越、技术先进的大型语言模型&#xff0c;其在多个方面展现了突出的表现。以下是基于我搜索到的资料对Qwen2.5-Max的详细评价&#xff1a; 技术特点 超大规模预训练数据&#xff1a;Qwen2.5-Max采用了超过20万亿tokens的超大规模预训…...

吴晓波 历代经济变革得失@简明“中国经济史” - 读书笔记

目录 《历代经济变革得失》读书笔记一、核心观点二、主要内容&#xff08;一&#xff09;导论&#xff08;二&#xff09;春秋战国时期&#xff08;三&#xff09;汉代&#xff08;四&#xff09;北宋&#xff08;五&#xff09;明清时期&#xff08;六&#xff09;近现代&…...

SQL GROUP BY 详解

SQL GROUP BY 详解 引言 在数据库查询中,GROUP BY 子句是一个非常有用的工具,它允许我们对查询结果进行分组,并基于这些分组进行聚合计算。本文将详细介绍 GROUP BY 的用法、注意事项以及在实际应用中的场景。 什么是 GROUP BY? GROUP BY 子句用于对查询结果进行分组。…...

走向基于大语言模型的新一代推荐系统:综述与展望

HightLight 论文题目&#xff1a;Towards Next-Generation LLM-based Recommender Systems: A Survey and Beyond作者机构&#xff1a;吉林大学、香港理工大学、悉尼科技大学、Meta AI论文地址&#xff1a; https://arxiv.org/abs/2410.1974 基于大语言模型的下一代推荐系统&…...

6 Flink 状态管理

6 Flink 状态管理 1. State-Keyed State2. State-Operator State3. Broadcast State 我们前面写的 wordcount 的例子&#xff0c;没有包含状态管理。如果一个task在处理过程中挂掉了&#xff0c;那么它在内存中的状态都会丢失&#xff0c;所有的数据都需要重新计算。从容错和消…...

第1章 量子暗网中的血色黎明

月球暗面的危机与阴谋 量子隧穿效应催生的幽蓝电弧&#xff0c;于环形山表面肆意跳跃&#xff0c;仿若无数奋力挣扎的机械蠕虫&#xff0c;将月球暗面的死寂打破&#xff0c;徒增几分诡异。艾丽伫立在被遗弃的“广寒宫”量子基站顶端&#xff0c;机械义眼之中&#xff0c;倒映着…...

爬虫基础(六)代理简述

目录 一、什么是代理 二、基本原理 三、代理分类 一、什么是代理 爬虫一般是自动化的&#xff0c;当我们自动运行时 爬虫自动抓取数据&#xff0c;但一会就出现了错误&#xff1a; 如&#xff0c;您的访问频率过高&#xff01; 这是因为网站的反爬措施&#xff0c;如果频…...

前端 Vue 性能提升策略

一、引言 前端性能优化是确保 Web 应用快速响应和流畅用户体验的关键。对于使用 Vue.js 构建的应用,性能优化不仅涉及通用的前端技术,还包括针对 Vue 特性的特定优化措施。本文将从多个方面探讨如何全面提升前端和 Vue 应用的性能。 二、前端性能优化基础 1. 减少初始加载…...

MCU内部ADC模块误差如何校准

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、ADC误差校准引言 MCU 片内 ADC 模块的误差总包括了 5 个静态参数 (静态失调&#xff0c;增益误差&#xff0c;微分非线性…...

Spring MVC消息转换器

在Spring MVC框架中&#xff0c;extendMessageConverters 通常与消息转换器&#xff08;Message Converters&#xff09;相关。消息转换器是Spring MVC用于将HTTP请求和响应主体&#xff08;body&#xff09;转换为Java对象和字符串的组件。它们在处理不同的媒体类型&#xff0…...

手写防抖函数、手写节流函数

文章目录 1 手写防抖函数2 手写节流函数 1 手写防抖函数 函数防抖是指在事件被触发n秒后再执行回调&#xff0c;如果在这n秒内事件又被触发&#xff0c;则重新计时。这可以使用在一些点击请求的事件上&#xff0c;避免因为用户的多次点击向后端发送多次请求。 function debou…...

【Rust自学】15.4. Drop trait:告别手动清理,释放即安全

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.4.1. Drop trait的意义 类型如果实现了Drop trait&#xff0c;就可以让程序员自定义当值离开作用域时发生的操作。例如文件、网络资源…...

【Block总结】CPCA,通道优先卷积注意力|即插即用

论文信息 标题: Channel Prior Convolutional Attention for Medical Image Segmentation 论文链接: arxiv.org 代码链接: GitHub 创新点 本文提出了一种新的通道优先卷积注意力&#xff08;CPCA&#xff09;机制&#xff0c;旨在解决医学图像分割中存在的低对比度和显著…...