Flask 使用Flask-SQLAlchemy操作数据库

news2025/2/2 16:12:36

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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2290844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[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…

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

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

大白话讲清楚embedding原理

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

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

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

ios swift画中画技术尝试

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

ArkTS高性能编程实践

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

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

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

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

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

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

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

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

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

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

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

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

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

信息学奥赛一本通 1607:【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2

【题目链接】 ybt 1607:【 例 2】任务安排 2 洛谷 P10979 任务安排 2 注:ybt1607中n最大达到 1 0 4 10^4 104,洛谷P10979中n最大达到 3 ∗ 1 0 5 3*10^5 3∗105,本题解统一认为n最大达到 3 ∗ 1 0 5 3*10^5 3∗105。 【题目考点…

OFDM系统仿真

1️⃣ OFDM的原理 1.1 介绍 OFDM是一种多载波调制技术,将输入数据分配到多个子载波上,每个子载波上可以独立使用 QAM、PSK 等传统调制技术进行调制。这些子载波之间互相正交,从而可以有效利用频谱并减少干扰。 1.2 OFDM的核心 多载波调制…

【Go语言圣经】第四节:复合数据类型

第四章:复合数据类型 本节主要讨论四种类型——数组、slice、map和结构体。 数组和结构体都是有固定内存大小的数据结构。相比之下,slice 和 map 则是动态的数据结构,它们可以根据需要动态增长。 4.1 数组 数组是一个定长的由特定类型元素…

完美还是完成?把握好度,辨证看待

完美还是完成? 如果说之前这个答案有争议,那么现在,答案毋庸置疑 ■为什么完美大于完成 ●时间成本: 做事不仅要考虑结果,还要考虑时间和精力,要说十年磨一剑的确质量更好,但是现实没有那么多…