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

【实战Flask API项目指南】之六 数据库集成 SQLAlchemy

实战Flask API项目指南之 数据库集成

本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧!

前言

在上一篇文章中,我们实现了一个 图书馆里系统API的后端,小菜觉得美中不足的是它使用一个 Python的列表用于存储图书的信息,是一个 本地版图书管理系统后端API。重新启动程序图书的数据就会丢失了。所以这节,我们将用上数据库来帮助小菜解决这一痛点,实现持久化数据存储。

当小菜踏入Flask后端开发的世界时,数据库是存储和管理数据的关键。

Flask并没有内置数据库功能,但是提供了扩展机制,可以方便地集成第三方数据库库。本文将介绍如何在 Flask 项目中集成SQLAlchemy,这是一个流行的Python ORM库。 我们将会在上一节课的基础上改写,让读者朋友们了解如何在 Flask应用中集成数据库。

注意:本文直接直接上代码,干货满满。




SQLAlchemy

1. 安装依赖

Flask 中,可以使用各种数据库,如SQLite、MySQL、PostgreSQL等。首先,需要安装所需的数据库驱动库,例如flask-sqlalchemy用于集成 SQLAlchemy

在使用 SQLAlchemy 进行数据库操作时,大部分操作是相似的,无论使用哪种数据库类型。(本文使用的是 MYSQL)

首先我们需要安装对应的依赖库,使用以下命令。

pip install flask-sqlalchemy flask-mysqldb

2. 配置数据库

Flask 应用中配置数据库连接信息。在应用的配置中,添加数据库的连接字符串。

  • 确保将usernamepasswordlocalhostflask替换为自己的MySQL数据库的用户名、密码、主机和数据库名称。
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
# mysql示例
# app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/database'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@localhost/flask'db = SQLAlchemy(app)

3. 定义数据模型

使用SQLAlchemy,可以定义数据模型作为 Python 类。每个类对应一个表,类的属性对应表中的列。数据模型是数据库中表格的抽象表示,它定义了表格的结构和字段。

在下面代码中,定义了一个名为Book的数据模型,它有三列

  • book_id 字段作为主键,用作主键(primary key),唯一的,不允许为空

  • title 字段表示书籍的标题,字符串类型,最大长度为100字符,不允许为空

  • author 字段表示书籍的作者,字符串类型,最大长度为50字符,不允许为空

  • 因为在我们的案例中,数据表只需要这三列。

class Book(db.Model):book_id = db.Column(db.Integer, primary_key=True, unique=True, nullable=False)title = db.Column(db.String(100), nullable=False)author = db.Column(db.String(50), nullable=False)

附上SQLAlchemy中常用的列设置选项:

选项描述
primary_key=True将列标记为主键,用于唯一标识每行数据。
nullable=False指定列不允许为空值。
unique=True确保列中的值是唯一的,不允许重复值。
default=<value>为列设置默认值,如果插入数据时未提供值,则使用默认值。
index=True创建列的索引,以提高检索性能。
autoincrement=True自动生成递增的值(通常与主键一起使用)。
onupdate=<value>在更新行时设置列的值为指定的值。
server_default=<value>设置列的服务器默认值,通常在数据库层面实现。

4. 常用数据库操作

当使用SQLAlchemy时,有许多常用的数据库操作方法,用于执行CRUD(创建、读取、更新、删除)操作。以下是一些常用的SQLAlchemy操作方法示例:

请注意,这些示例假定你已经正确配置了SQLAlchemy和数据库连接。

  1. 创建数据(Create)

    # 创建一个新对象并将其添加到数据库中
    new_book = Book(title="Sample Book", author="John Doe")
    db.session.add(new_book)
    db.session.commit()
    
  2. 读取数据(Read)

    # 查询所有书籍
    books = Book.query.all()# 根据条件查询书籍
    specific_book = Book.query.filter_by(title="Sample Book").first()
    
  3. 更新数据(Update)

    # 查询要更新的对象
    book_to_update = Book.query.filter_by(title="Sample Book").first()# 更新对象的属性
    book_to_update.author = "New Author"
    db.session.commit()
    
  4. 删除数据(Delete)

    # 查询要删除的对象
    book_to_delete = Book.query.filter_by(title="Sample Book").first()# 从数据库中删除对象
    db.session.delete(book_to_delete)
    db.session.commit()
    
  5. 过滤和排序(Filter and Sort)

    # 查询所有作者是"John Doe"的书籍
    johns_books = Book.query.filter_by(author="John Doe").all()# 查询前5本书籍并按书名升序排列
    top_books = Book.query.order_by(Book.title).limit(5).all()
    
  6. 聚合和统计(Aggregate and Count)

    # 计算书籍总数
    book_count = Book.query.count()# 计算不同作者的书籍数量
    author_book_count = db.session.query(Book.author, db.func.count(Book.book_id)).group_by(Book.author).all()
    



SQLAlchemy中常用的操作及其描述:

操作描述
定义数据模型使用db.Model定义数据模型,并定义字段及其属性。
创建数据表使用db.create_all()创建定义的数据模型对应的数据表。
查询数据使用db.session.query()创建查询对象,并添加查询条件。
插入数据使用db.session.add()添加新数据对象,并提交更改。
更新数据获取数据对象,修改属性后使用db.session.commit()提交更改。
删除数据使用db.session.delete()添加要删除的数据对象,并提交更改。
过滤条件在查询中使用filterfilter_by等方法添加过滤条件。
排序使用order_by方法指定查询结果的排序方式。
限制数量使用limitoffset限制查询结果的数量和偏移量。
聚合和统计使用func函数进行聚合和统计操作,如func.count()
关联表查询使用relationship定义关联关系,使用join进行关联查询。
事务管理使用db.session.begin()开始事务,使用commit提交更改,或rollback回滚更改。
批量操作使用db.session.bulk_insert_mappings()进行批量插入,使用db.session.bulk_update_mappings()进行批量更新。
连接查询使用join进行多表连接查询,使用select_fromouterjoin等方法进行不同类型的连接。
原始SQL查询使用db.session.execute()执行原始的SQL查询。

5. 创建数据表

app.py的末尾,添加以下代码来创建数据表:

Flask-SQLAlchemy中,可以使用db.create_all()来创建所有定义的数据模型对应的数据表。在app.py的末尾,添加以下代码:

db.create_all()

但有时候会抛出一个 RuntimeError 的异常,

提示说在应用程序上下文之外工作,所以在前面添加 with app.app_context(),如下所示:

# 创建数据表
with app.app_context():db.create_all()  # 或其他需要应用上下文的操作

6. 持久化数据存储的图书管理系统

这里将会在上一节课 本地版图书管理系统 的基础上,使用SQLAlchemy 改写成持久化数据存储的图书管理系统。

上代码

# -*- coding: utf-8 -*-from flask_sqlalchemy import SQLAlchemy
from flask import (Flask, jsonify, request)app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@localhost/flask'  # 替换为你的数据库 URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)# 定义Book模型类
class Book(db.Model):book_id = db.Column(db.Integer, primary_key=True, unique=True, nullable=False)title = db.Column(db.String(100), nullable=False)author = db.Column(db.String(50), nullable=False)# 获取所有书籍
@app.route("/books", methods=["GET"])
def get_all_books():books = Book.query.all()book_list = [{"id": book.book_id, "title": book.title, "author": book.author} for book in books]return jsonify(book_list), 200# 获取特定书籍
@app.route("/books/<int:book_id>", methods=["GET"])
def get_book(book_id):book = Book.query.get(book_id)if book:return jsonify({"id": book.book_id, "title": book.title, "author": book.author}), 200return jsonify({"error": "Book not found."}), 404# 创建新书籍
@app.route("/books", methods=["POST"])
def create_book():data = request.jsonnew_book = Book(title=data["title"], author=data["author"])db.session.add(new_book)db.session.commit()return jsonify({"id": new_book.book_id, "title": new_book.title, "author": new_book.author}), 201# 更新书籍信息
@app.route("/books/<int:book_id>", methods=["PUT"])
def update_book(book_id):book = Book.query.get(book_id)if book:data = request.jsonbook.title = data["title"]book.author = data["author"]db.session.commit()return jsonify({"id": book.book_id, "title": book.title, "author": book.author}), 200return jsonify({"error": "Book not found."}), 404# 删除书籍
@app.route("/books/<int:book_id>", methods=["DELETE"])
def delete_book(book_id):book = Book.query.get(book_id)if book:db.session.delete(book)db.session.commit()return "", 204return jsonify({"error": "Book not found."}), 404if __name__ == "__main__":app.run(debug=True)

现在,小菜可以使用GET、POST、PUT和DELETE请求来访问API端点,并对图书数据进行操作。这个例子演示了如何在 Flask 应用中集成数据库、定义数据模型、执行数据库操作以及使用API端点来操作数据。这将帮助小菜更好地理解 Flask 中的数据库集成。

总结

这篇文章深入探讨了在Flask应用中集成数据库的关键步骤,通过引入SQLAlchemy这一流行的Python ORM库,实现了数据的持久化存储。文章首先介绍了安装依赖以及配置数据库的过程,然细讲解了如何定义数据模型以及常见的数据库操作方法。重点强调了如何使用Flask-SQLAlchemy扩展来简化数据库交互的过程。

通过以上步骤,小菜已经成功地在 Flask 应用中集成了MySQL数据库,并实现了图书的增删改查等操作。小菜获得了以下知识:

  • 如何配置Flask应用以连接数据库。
  • 如何使用SQLAlchemy定义数据模型和表格结构。
  • 如何执行常见的数据库操作,包括创建、读取、更新和删除数据。
  • 如何使用Flask-SQLAlchemy扩展简化数据库交互。

通过本文的学习,小菜已经理解了Flask中数据库集成和操作,这为后面小菜需要实现后端API平台打下了扎实的基础!

相关文章:

【实战Flask API项目指南】之六 数据库集成 SQLAlchemy

实战Flask API项目指南之 数据库集成 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 在上一篇文章中&#xff0c;我们实现了…...

MFC网络通信-Udp服务端

目录 1、UI的布局 2、代码的实现&#xff1a; &#xff08;1&#xff09;、自定义的子类CServerSocket &#xff08;2&#xff09;、重写OnReceive事件 &#xff08;3&#xff09;、在CUdpServerDlg类中处理 &#xff08;4&#xff09;、在OnInitDialog函数中 &#xff0…...

最简单且有效的msvcp140.dll丢失的解决方法,有效的解决msvcp140.dll丢失

在我们使用电脑的过程中&#xff0c;有时会遇到一些令人困扰的问题&#xff0c;如msvcp140.dll文件丢失。对于许多不熟悉这方面技术的小伙伴来说&#xff0c;遇到msvcp140.dll丢失的问题可能会觉得棘手。其实这是一个很常见的问题&#xff0c;并且解决起来并不复杂。接下来将给…...

HBase理论与实践-基操与实践

基操 启动&#xff1a; ./bin/start-hbase.sh 连接 ./bin/hbase shell help命令 输入 help 然后 <RETURN> 可以看到一列shell命令。这里的帮助很详细&#xff0c;要注意的是表名&#xff0c;行和列需要加引号。 建表&#xff0c;查看表&#xff0c;插入数据&#…...

内存管理设计精要

系统设计精要是一系列深入研究系统设计方法的系列文章&#xff0c;文中不仅会分析系统设计的理论&#xff0c;还会分析多个实际场景下的具体实现。这是一个季更或者半年更的系列&#xff0c;如果你有想要了解的问题&#xff0c;可以在文章下面留言。 持久存储的磁盘在今天已经不…...

Java——StringBuffer与StringBuilder的区别

Java——StringBuffer与StringBuilder的区别 StringBuffer和StringBuilder是Java中用于处理字符串的两个类&#xff0c;它们之间的主要区别在于线程安全性和性能方面。 1. 线程安全性&#xff1a; StringBuffer&#xff1a;StringBuffer 是线程安全的&#xff0c;所有的公共方…...

基于深度学习的菠萝与果叶视觉识别及切断机构设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、课题内容二、总体方案确定2.1 方案选择2.2 菠萝的视觉识别流程2.3 菠萝果叶切断机构设计流程 三 基于深度学习的菠萝检测模型3.1 卷积神经网络简介3.2 YOLO卷积神经网络3.3 图像采集与数据制作3.4 数据训练与…...

springboot整合七牛云oss操作文件

文章目录 springboot整合七牛云oss操作文件核心代码&#xff08;记得修改application.yml配置参数⭐&#xff09;maven依赖QiniuOssProperties配置类UploadControllerResponseResult统一封装响应结果ResponseType响应类型枚举OssUploadService接口QiniuOssUploadServiceImpl实现…...

跨国传输的常见问题与对应解决方案

在今天的全球化时代&#xff0c;跨国数据传输已经成为一个不可或缺的需求。不论是个人还是企业&#xff0c;都需要通过网络将文件或数据从一个国家传输到另一个国家&#xff0c;以实现信息共享、协作、备份等目的。然而&#xff0c;跨国数据传输并不是一项容易的任务&#xff0…...

Git(七).git 文件夹瘦身,GitLab 永久删除文件

目录 一、问题背景二、问题复现2.1 新建项目2.2 上传大文件2.3 上传结果 三、解决方案3.1 GitLab备份与还原1&#xff09;备份2&#xff09;还原 3.2 删除方式一&#xff1a;git filter-repo 命令【推荐】1&#xff09;安装2&#xff09;删除本地仓库文件3&#xff09;重新关联…...

多线程锁的升级原理是什么

在 Java 中&#xff0c;锁共有 4 种状态&#xff0c;级别从低到高依次为&#xff1a;无状态锁&#xff0c;偏向锁&#xff0c;轻量级锁和重量级锁状态&#xff0c;这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。 多线程锁锁升级过程 如下图所示 多线程锁的升级过程…...

金山文档轻维表之删除所有行记录

目前脚本文档里面的只有删除行记录功能&#xff0c;但是需要指定ID值&#xff0c;不能实现批量删除&#xff0c;很多人反馈但是官方无回应&#xff0c;挺奇怪的 但是批量删除的需求我很需要&#xff0c;最后研究了一下&#xff0c;还是挺容易实现的 测试&#xff1a; 附上脚本…...

站坑站坑站坑站坑站坑

站坑站坑站坑站坑站坑站坑站坑...

在Vue中,你可以使用动态import()语法来动态加载组件

在Vue中&#xff0c;你可以使用动态import()语法来动态加载组件。动态导入允许你在需要时异步加载组件&#xff0c;这样可以提高应用程序的初始加载性能。 下面是一个使用动态导入加载组件的示例&#xff1a; <template> <div> <button click"loadComp…...

金蝶云星空表单插件获取日期控件判空处理(代码示例)

文章目录 金蝶云星空表单插件获取日期控件判空处理C#实现 金蝶云星空表单插件获取日期控件判空处理 C#实现 DateTime? deliveryDate (DateTime?)this.View.Model.GetValue("FApproveDate");//审核日期long leadtime 20;//天数if (!deliveryDate.IsNullOrEmpty()…...

通过xshell传输文件到服务器

一、user is not in the sudoers file. This incident will be reported. 参考链接&#xff1a; [已解决]user is not in the sudoers file. This incident will be reported.(简单不容易出错的方式)-CSDN博客 简单解释下就是&#xff1a; 0、你的root需要设置好密码 sudo …...

centos7.9编译安装python3.7.2

联网环境下编译安装python3.7.2&#xff0c;不联网则需要配置cnetos7.9离线源 下载解压软件包 [rootlocalhost ~]# tar -xf Python-3.7.3.tar.gz [rootlocalhost ~]# ls anaconda-ks.cfg Python-3.7.3 Python-3.7.3.tar.gz [rootlocalhost ~]# [rootlocalhost ~]# cd Pytho…...

【教3妹学编程-算法题】2913. 子数组不同元素数目的平方和 I

-----------------第二天------------------------ 面试官 : 好的&#xff0c; 我们再来做个算法题吧。平时工作中会尝试用算法吗&#xff0c; 用到了什么数据结构&#xff1f; 3妹 : 有用到&#xff0c; 用到了 bla bla… 面试官 : 好的&#xff0c; 题目是这样的&#xff1…...

是否会有 GPT-5 的发布?

本心、输入输出、结果 文章目录 是否会有 GPT-5 的发布?前言围绕 GPT-5 的信息OpenAI 期待增长GPT-5 - 到底是真的在训练,还是一个虚构的故事Sam Altman字里行间包含的信息我们在什么时候可以期待 GPT-5 的发布GPT-5 预计将在哪些方向努力GPT-5 在听觉领域GPT-5 在视频处理领…...

使用 Selenium Python 检查元素是否存在

像 Selenium 这样的自动化工具使我们能够通过不同的语言和浏览器自动化 Web 流程并测试应用程序。 Python 是它支持的众多语言之一&#xff0c;并且是一种非常简单的语言。 它的Python客户端帮助我们通过Selenium工具与浏览器连接。 Web 测试对于开发 Web 应用程序至关重要&am…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...