iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Flask如何使用SQLAlchemy实现持久化数据
  • 912
分享到

Flask如何使用SQLAlchemy实现持久化数据

2023-06-20 16:06:52 912人浏览 泡泡鱼
摘要

这篇文章主要介绍“flask如何使用sqlAlchemy实现持久化数据”,在日常操作中,相信很多人在Flask如何使用SQLAlchemy实现持久化数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flask

这篇文章主要介绍“flask如何使用sqlAlchemy实现持久化数据”,在日常操作中,相信很多人在Flask如何使用SQLAlchemy实现持久化数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flask如何使用SQLAlchemy实现持久化数据”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录
  • 项目引入flask-sqlalchemy

  • ORM简介及模型定义

  • 表关系类型及编码实现

    • 一对多关系(多对一关系)

    • 一对一关系

    • 多对多关系

  • 数据库基本操作

    • 插入

    • 更新

    • 查询

    • 删除

项目引入flask-sqlalchemy

首先,安装flask-sqlalchemy扩展:

$pip install flask-sqlalchemy

然后,在项目中导入SQLAlchemy类,并实例化应用程序使用的数据库(以mysql为例):

from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = Trueapp.config['SQLALCHEMY_DATABASE_URI'] = 'Mysql://account:passWord@hostname/database'db = SQLAlchemy(app)

db对象是SQLAlchemy类的实例,表示程序使用的数据库,同时还获得了Flask-SQLAlchemy提供的所有功能。

ORM简介及模型定义

python中,可以使用数据库相应的包直接操作数据库,如Pymysql操作MySQL数据库,还有一些数据库抽象层代码包供选择,如这里要讨论的SQLAlchemy。该抽象包直接处理高等级的Python对象,而不用处理如表这样的数据库实体。
抽象层,就是所谓的对象关系映射(ORM),其最大的优势就是:能在用户不知觉的情况下把高层的面向对象操作转换成低层的数据库指令,极大简化代码编写。SQLAlchemy就是已与Flask很好集成的更高层抽象例子,其还支持多种关系型数据库引擎。

基于SQLAlchemy的模型定义:

class Roles(db.Model):    __tablename__ = 'roles'    id = db.Column(db.Integer, primary_key=True)    name = db.Column(db.String(64), unique=True)    users = db.relationship('Users', backref='role')class Users(db.Model):    __tablename__ = 'users'    id = db.Column(db.Integer, primary_key=True)    username = db.Column(db.String(64), unique=True, index=True)    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

__tablename__定义在数据库中使用的表名;

db.Column类构造函数的第1个参数是数据库表列(也是模型属性)的类型,其余的参数指定属性(数据库表列)的配置选项。

1 常用的SQLAlchemy列类型

类型名Python类型说明
Integerint普通整数,一般32位
SmallIntegerint取值范围小的整数,一般16位
BigIntegerint或long不限制精度的整数
Floatfloat浮点数
Stringstr变长字符串
Booleanbool布尔值
Datedatetime.date日期
Timedatetime.time时间
DateTimedatetime.datetime日期和时间
Textstr变长字符串,对较长或不限长度的字符串做了优化
Numericdecimal.Decimal定点小数

2 常用的SQLAlchemy列选项

选项名说明
primary_key如果设为True,这列就是表的主键
unique如果设为True,这列不允许重复值
index如果设为True,为该列创建索引,提升查询效率
nullable如果设为True,这列允许null值,如果设为false,不允许为空
default为这列定义默认值

表关系类型及编码实现

关系型数据库使用关系把不同表中的行联系起来。以上述模型定义代码为例,假设角色对用户是一对多的关系(即1个角色可属于多个用户,而每个用户只能有1个角色)。

一对多关系(多对一关系)

在“多”的一方,使用外键定义关系
如在Users模型中,定义role_id列为外键,给db.Column构造函数传递db.ForeignKey()参数,并将roles.id作为db.ForeignKey()的参数,其表明role_id列的值是roles表中行的id值。
在“一”的一方,基于面向对象的视角创建代表实例(记录或行)的属性,如上述的users = db.relationship(‘Users', backref=‘role')
db.relationship()的第1个参数表明这个关系的另一端是哪个模型,backref参数向Users模型添加一个role属性,从而定义反向关系。通过这一属性(role)可以替代role_id访问Roles模型,此时将获取的是模型对象,而不是外键的值。
如何理解上述这段话,可以从下面2句代码加深:

 users = inst_role.users user_role = user.role

通过第1句代码,可以直接获得特定角色实例(inst_role)相对应的所有users对象,且是以列表形式返回。
通过第2句代码,可以通过user实例直接获得该user所对应的role对象(1行记录,而不是Users模式定义的role_id字段值)。

一对一关系

要定义一对一的关系,只需基于一对多的模型定义基础上,给db.relationship()函数多传一个关键字表示关系选项:
users = db.relationship(‘Users', backref=‘role', userlist=False)
一对多与一对一在编码时,有个点需特别注意:当通过“一”的实例(db.relationship定义方)获取多的一方的对象时:

  • 一对多:users = inst_role.users返回的是对象列表

  • 一对一:users = inst_role.users返回的就是对象,而非列表

多对多关系

Pending…

数据库基本操作

在Flask-SQLAlchemy中,对数据库所做的改动均是通过数据库“会话”进行管理的,会话用db.session表示。如需用db.session.commit()提交对记录的修改,始终把数据库相关改动放在会话中提交,可避免因部分更新异常导致数据库中数据的不一致性。

插入

admin_role = Roles(name='Admin')    mod_role = Roles(name='Moderator')    john = Users(username='liyu', role=admin_role)    david = Users(username='liji', role=admin_role)    db.session.add(admin_role)    db.session.add(mod_role)    db.session.add(john)    db.session.add(david)    db.session.commit()

前4行代码,实例化2种角色及2个用户对象(映射至数据库即是给记录的字段赋值)
5~7行代码就是将新增角色及用户操作放在了1个session中,最后再统一提交(commit),可防止因其中某条语句异常而更新部分从而导致数据的不一致性。该操作就是将多个原子操作组成一个事务,如果某条更新失败就会导致整个会话失效。
5~7行还可简写成: db.session.add([admin_role, mod_role, john, david])

更新

在Flask-SQLAlchemy中,一条记录表示为一个对象;记录的字段表示为对象的属性,因此要更新字段值,实际上就是对对象的属性赋值:

admin_role.name = 'Administrator'db.session.add(admin_role)db.session.commit()

查询

查询表中所有记录:模式.query.all()

eg. Roles.query.all()

使用过滤器进行更精确查询

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

1 filter与filter_by区别

1.1 语法区别

filter需要用“类名.属性名”且需用==比较,而filter_by直接用属性名,比较用=

users = Users.query.filter(Users.id == 1).all()users =  Users.query.filter_by(id = 1).all()

1.2 组合查询

filter不支持组合查询,只能连续用filter来实现,而filter_by支持组合查询(下面2条语句效果一样)

users = Users.query.filter(Users.id == 1).filter(Users.username == 'xxx').all()users =  Users.query.filter_by(id = 1, username='xxx').all()# filter_by也支持连续使用

注:如果要查看SQLAlchemy为查询生成的原生SQL查询语句,只需把query对象转换成字符串: str(Users.query.filter_by(role=admin_role))

删除

执行查询

在查询上应用指定的过滤器后,通过调用all()触发执行查询,常见的触发执行方法有: 

方法说明
all()查询所有结果
first()返回查询的第1个结果,没有返回None
get()返回指定主键对应的行,没有返回None
count()返回查询结果的数量
first_or_404()返回查询的第1个结果,如果没有结果,则终止请求,返回404错误响应
get_or_404()返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回404错误响应
paginate()返回一个paginate对象

1 一对多

1.1 从“一”获取对应的所有多端对象

users = inst_role.users //直接通过角色对象的users属性获取所有属于该角色的用户对象role = inst_user.role  //直接通过用户实例的role属性获取该用户所属的角色对象,注意这里获取的是角色对象,而不仅是角色ID

注:inst_role.users获取对象时,隐含了调用all()方法触发执行,但如果像加一些过滤器(如排序),则需要在db.relationship中添加lazy='dynamic'关键字参数。然后即可引入过滤器:inst_role.users.order_by(Users.username)

2 多对多

Pending…

在Flask-SQLAlchemy中,删除数据库记录,可映射至删除代表该记录的对象:

db.session.delete(mod_role)db.session.commit()

到此,关于“Flask如何使用SQLAlchemy实现持久化数据”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Flask如何使用SQLAlchemy实现持久化数据

本文链接: https://www.lsjlt.com/news/298202.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Flask如何使用SQLAlchemy实现持久化数据
    这篇文章主要介绍“Flask如何使用SQLAlchemy实现持久化数据”,在日常操作中,相信很多人在Flask如何使用SQLAlchemy实现持久化数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flask...
    99+
    2023-06-20
  • Flask使用SQLAlchemy实现持久化数据
    目录项目引入flask-sqlalchemy ORM简介及模型定义 表关系类型及编码实现 一对多关系(多对一关系) 一对一关系 多对多关系 数据库基本操作 插入 更新 查询 删除 项...
    99+
    2024-04-02
  • 如何使用Redis实现数据持久化
    如何使用Redis实现数据持久化引言Redis是一种快速、高效的内存数据库,但默认情况下它的数据是存储在内存中的。这就意味着一旦服务器断电或重启,Redis中的数据将会丢失。为了解决这个问题,Redis提供了一些机制来实现数据的持久化。本文...
    99+
    2023-11-07
    数据 redis 持久化
  • flask-SQLALchemy连接数据库如何实现
    本文小编为大家详细介绍“flask-SQLALchemy连接数据库如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“flask-SQLALchemy连接数据库如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-07-02
  • docker如何实现数据持久化
    这篇文章主要为大家展示了“docker如何实现数据持久化”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“docker如何实现数据持久化”这篇文章吧。 docke...
    99+
    2024-04-02
  • Flask SQLALchemy如何使用
    这篇文章主要介绍“Flask SQLALchemy如何使用”,在日常操作中,相信很多人在Flask SQLALchemy如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flask SQLALchemy如...
    99+
    2023-07-02
  • 如何在Flask中使用SQLAlchemy连接数据库
    这篇文章将为大家详细讲解有关如何在Flask中使用SQLAlchemy连接数据库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、连接mysql在 Flask-SQLAlchemy 中,数据...
    99+
    2023-06-14
  • flask-SQLALchemy连接数据库的实现示例
    目录SQLALchemy介绍:sqlalchemy与Flask-sqlalchemy的区别:表关系:flask——Migrate插件一、基本用法二、项目重构:...
    99+
    2024-04-02
  • Vuex数据持久化怎么实现
    小编给大家分享一下Vuex数据持久化怎么实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是vuexvuex :是一个专为vue.js开发的状态管理器,采用集...
    99+
    2023-06-15
  • mongodb数据持久化怎么实现
    在MongoDB中,数据持久化是通过将数据写入硬盘来实现的。MongoDB会在后台自动将数据写入到磁盘中,以确保数据的持久性。 Mo...
    99+
    2023-10-21
    mongodb
  • mysql怎么实现数据持久化
    MySQL可以通过以下几种方式来实现数据持久化: 使用磁盘存储:MySQL将数据存储在硬盘上,包括数据文件、日志文件等。这样即使...
    99+
    2023-10-21
    mysql
  • Redis怎么实现数据持久化
    Redis 有两种数据持久化的方式:RDB持久化和AOF持久化。 RDB持久化: RDB持久化是通过定期将内存中的数据快照写入磁...
    99+
    2024-05-07
    Redis
  • android数据持久化怎么实现
    在Android中,有多种方式可以实现数据持久化,下面列举了几种常见的方法:1. Shared Preferences(共享首选项)...
    99+
    2023-10-21
    android
  • redis如何持久化数据库
    redis持久化数据库的方法:快照的方式持久化到磁盘,配置代码如下:save 900 1save 300 10save 60 10000上面的配置规则意思如下:# In the example below the behaviour wil...
    99+
    2024-04-02
  • 使用PHP怎么实现数据库连接持久化
    本篇文章给大家分享的是有关使用PHP怎么实现数据库连接持久化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。PHP中的数据库连接持久化数据库的优化是我们做web开发的重中之重,甚...
    99+
    2023-06-15
  • Pinia简单使用及数据持久化怎么实现
    这篇文章主要讲解了“Pinia简单使用及数据持久化怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Pinia简单使用及数据持久化怎么实现”吧!基本介绍Pinia 是 Vue.js 的轻...
    99+
    2023-06-30
  • 如何使用Go和Redis进行数据持久化
    如何使用Go和Redis进行数据持久化引言:在现代应用开发中,数据持久化是非常重要的一环。数据库是最常见的数据持久化解决方案,但有时候,我们也需要使用键值存储来对应用程序的数据进行存储和访问。Redis是一个流行的键值存储系统,它具有快速、...
    99+
    2023-10-26
    Go语言 redis 数据持久化
  • 如何在Storm中实现数据的持久化存储
    在Storm中实现数据的持久化存储通常可以通过以下几种方法: 使用数据库:可以将Storm处理的数据存储到关系型数据库(如MySQ...
    99+
    2024-04-09
    Storm
  • 在Unity中如何实现数据的持久化存储
    在Unity中实现数据的持久化存储可以通过以下几种方式: PlayerPrefs:Unity自带的一种简单的持久化存储方案,可以存...
    99+
    2024-05-09
    Unity
  • redis数据持久化的实现方法
    小编给大家分享一下redis数据持久化的实现方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!Redis实现数据持久化的两种实现方式:RDB:指定的时间间隔内保存数据快照AOF:先把命令追加到...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作