SQLAlchemy(alembic)和Flask-SQLAlchemy入门教程

SQLAlchemy 是 Python 生态中最流行的 ORM 类库,alembic 用来做 OMR 模型与数据库的迁移与映射,Flask-SQLAlchemy 是 Flask 的扩展,可为应用程序添加对 SQLAlchemy 的支持,简化 SQLAlchemy 与 Flask 的使用。

一.SQLAlchemy 和 alembic

1.SQLAlchemy 介绍

SQLAlchemy 分成三部分:

  • ORM:用类来表示数据库 schema 部分
  • SQLAlchemy Core:一些基础操作,比如update、insert等,也可直接使用这部分来进行操作,但是写起来没有 ORM 那么简洁
  • DBAPI:数据库驱动

安装 alembicsqlalchemy 库:

pip install alembic
pip install sqlalchemy

2.初始化 migrations 仓库

在项目目录中,执行命令 alembic init migrations,创建一个名叫 migrations 的仓库。

3.创建模型类

创建一个 models.py 模块,然后在里面定义模型类:

from sqlalchemy import Column,Integer,String,create_engine,Text
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()
class User(Base):__tablename__ = 'user'id = Column(Integer,primary_key=True)username = Column(String(20),nullable=False)password = Column(String(100),nullable=False)class Article(Base):__tablename__ = 'article'id = Column(Integer,primary_key=True)title = Column(String(100),nullable=False)content = Column(Text, nullable=False)

4.设置数据库连接

sqlalchemy.url = mysql+mysqldb://root:password@localhost:4306/alembic?charset=utf8

5.设置 target_metadata

为了使用模型类更新数据库,需要在 env.py 文件中设置 target_metadata,默认为 target_metadata=None。使用 sys 模块把当前项目的路径导入到 path 中:

import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../")
from models import Base
... #省略代码
target_metadata = Base.metadata # 设置创建模型的元类
... #省略代码

6.生成迁移文件

alembic revision --autogenerate -m "message"

7.更新数据库

alembic upgrade head

真正映射到数据库中的数据表文件:

如果要降级,那么使用 alembic downgrade head

8.Alembic 常用命令

这些命令用于管理和应用数据库迁移,使数据库 schema 保持与模型同步。

命令功能
init创建一个 Alembic 仓库
revision创建一个新的版本文件
–autogenerate自动将当前模型的修改生成迁移脚本
-m指定本次迁移的描述,方便回顾
upgrade将指定版本的迁移文件映射到数据库中,会执行版本文件中的 upgrade 函数。如果有多个迁移脚本没有被映射到数据库中,那么会执行多个迁移脚本
[head]代表最新的迁移脚本的版本号
downgrade执行指定版本的迁移文件中的 downgrade 函数
heads展示 head 指向的脚本文件版本号
history列出所有的迁移版本及其信息
current展示当前数据库中的版本号

在第一次执行 upgrade 的时候,就会在数据库中创建一个名叫 alembic_version 表,这个表只会有一条数据,记录当前数据库映射的是哪个版本的迁移文件。

二.Flask-Migrate

1.Flask-Migrate 介绍和安装

Flask-Migrate 是一个使用 Alembic 处理 Flask 应用程序的 SQLAlchemy 数据库迁移的扩展。

使用 pip 命令安装 Flask-Migrate

pip install Flask-Migrate

2.Flask-Migrate 数据库迁移示例

这是一个通过 Flask-Migrate 处理数据库迁移的示例应用程序:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrateapp = Flask(__name__)
# app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_DATABASE_URI'] = mysql+mysqldb://root:password@localhost:4306/alembic?charset=utf8db = SQLAlchemy(app)
migrate = Migrate(app, db)class User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(128))

通过上述应用程序,可使用以下命令创建迁移存储库:

flask db init

一种简单的解决方案:修改 User.py 为 app.py。如下所示:

这会将迁移文件夹添加到应用程序中。该文件夹的内容需要与其它源文件一起添加到版本控制中,然后可生成初始迁移:

flask db migrate -m "Initial migration."

然后可将迁移脚本描述的更改应用到数据库:

flask db upgrade

执行 flask db upgrade 命令后生成的数据表:

每次数据库模型更改时,请重复 migrateupgrade 命令。

三.Flask-SQLAlchemy

1.Flask-SQLAlchemy 介绍和安装

Flask-SQLAlchemy 是 Flask 的扩展,可为应用程序添加对 SQLAlchemy 的支持。它旨在通过提供有用的默认值和额外的帮助程序来简化 SQLAlchemy 与 Flask 的使用,从而更轻松地完成常见任务。

pip install -U Flask-SQLAlchemy

2.实现 User 增删改查

from flask import Flask, request
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask import jsonifyapp = Flask(__name__)  # 创建一个Flask实例
# app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqldb://root:password@localhost:4306/migrate?charset=utf8'db = SQLAlchemy(app)  # 创建一个SQLAlchemy实例
migrate = Migrate(app, db)  # 创建一个Migrate实例class User(db.Model):  # 创建一个User类,继承自db.Modelid = db.Column(db.Integer, primary_key=True)  # 创建一个id列,主键name = db.Column(db.String(128))  # 创建一个name列,字符串类型# 创建用户
@app.route('/users', methods=['POST'])
def create_user():data = request.get_json()new_user = User(name=data['name'])db.session.add(new_user)db.session.commit()return jsonify({'message': 'User created successfully'}), 201# 获取所有用户
@app.route('/users', methods=['GET'])
def get_users():users = User.query.all()output = []for user in users:user_data = {'id': user.id, 'name': user.name}output.append(user_data)return jsonify({'users': output})# 获取单个用户
@app.route('/users/<id>', methods=['GET'])
def get_user(id):user = User.query.get_or_404(id)return jsonify({'id': user.id, 'name': user.name})# 更新用户
@app.route('/users/<id>', methods=['PUT'])
def update_user(id):data = request.get_json()user = User.query.get_or_404(id)user.name = data['name']db.session.commit()return jsonify({'message': 'User updated successfully'})# 删除用户
@app.route('/users/<id>', methods=['DELETE'])
def delete_user(id):user = User.query.get_or_404(id)db.session.delete(user)db.session.commit()return jsonify({'message': 'User deleted successfully'})if __name__ == '__main__':app.run(debug=True)  # 运行Flask应用

(1)获取所有用户

(2)创建用户

在 Headers 中设置 Content-Type: application/json。如下所示:

(3)获取单个用户

(4)更新用户

在 Headers 中设置 Content-Type: application/json。如下所示:

(5)删除用户

参考文献

[1] alembic:https://alembic.sqlalchemy.org/en/latest/index.html

[2] SQLAlchemy:https://docs.sqlalchemy.org/en/20/

[3] Flask-SQLAlchemy:https://flask-sqlalchemy.palletsprojects.com/en/3.1.x/

[4] alembic 教程:https://hellowac.github.io/technology/python/alembic/

[5] SQLAlchemy 2.0 教程:https://yifei.me/note/2652

[6] Flask-Migrate:https://flask-migrate.readthedocs.io/en/latest/

[7] Flask-Migrate GitHub:https://github.com/miguelgrinberg/flask-migrate

[8] Flask-SQLAlchemy 快速入门:http://www.pythondoc.com/flask-sqlalchemy/quickstart.html

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

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

相关文章

下载后端返回的图片,而不是打开图片

使用 window.location.href 和 window.open 后都是打开图片&#xff0c;原因是&#xff0c;当浏览器发现是浏览器支持的文件类型&#xff0c;例如 jpg、png、svg 等&#xff0c;默认是浏览器打开。 解决 fetch createObjectURL fetch 转换为 blob 对象 createObjectURL() 静…

GraphPad Prism生物医学数据分析软件下载安装 GraphPad Prism轻松绘制各种图表

Prism软件作为一款功能强大的生物医学数据分析与可视化工具&#xff0c;其绘图功能尤为突出。该软件不仅支持绘制基础的图表类型&#xff0c;如直观明了的柱状图、展示数据分布的散点图&#xff0c;以及描绘变化趋势的曲线图&#xff0c;更能应对复杂的数据呈现需求&#xff0c…

Excel保存时弹出“请注意,您的文档的部分内容可能包含文档检查器无法删除的个人信息”

前言 Excel保存时弹出“请注意&#xff0c;您的文档的部分内容可能包含文档检查器无法删除的个人信息”&#xff0c;本节会介绍如何查看无法删除的个人信息是什么&#xff0c;以及如何关闭该提示窗口 一、关闭弹窗提醒 1、点击文件 – 选项 2、点击选择信任中心 – 信任中心…

高斯过程的数学理解

目录 一、说明 二、初步&#xff1a;多元高斯分布 三、 线性回归模型与维度的诅咒 四、高斯过程的数学背景 五、高斯过程的应用&#xff1a;高斯过程回归 5.1 如何拟合和推理高斯过程模型 5.2 示例&#xff1a;一维数据的高斯过程模型 5.3 示例&#xff1a;多维数据的高斯过程模…

C#——Property属性详情

属性 属性&#xff08;Property&#xff09;是类&#xff08;class&#xff09;、结构体&#xff08;structure&#xff09;和接口&#xff08;interface&#xff09;的成员&#xff0c;类或结构体中的成员变量称为字段&#xff0c;属性是字段的扩展&#xff0c;使用访问器&am…

【漏洞复现】Atlassian Confluence RCE(CVE-2023-22527)

产品简介 Atlassian Confluence 是一款由Atlassian开发的企业团队协作和知识管理软件&#xff0c;提供了一个集中化的平台&#xff0c;用于创建、组织和共享团队的文档、知识库、项目计划和协作内容。是面向大型企业和组织的高可用性、可扩展性和高性能版本。 0x02 漏洞概述 …

<电力行业> - 《第12课:配电(2)》

5 配网的指标 配电网与广大用户紧密联系&#xff0c;所以配电网是否合格还是十分重要的。 评判配电网的标准&#xff0c;主要有四个指标&#xff1a; 供电可靠性&#xff1a;供电可靠性是指针对用户连续供电的可靠程度。网损率&#xff1a;网损率可定义为电力网的电能损耗量与…

HarmonyOS Next开发学习手册——Native XComponent

场景介绍 Native XComponent是XComponent组件提供在Native层的实例&#xff0c;可作为JS层和Native层XComponent绑定的桥梁。XComponent所提供的NDK接口都依赖于该实例。接口能力包括获取Native Window实例、获取XComponent的布局/事件信息、注册XComponent的生命周期回调、注…

空域时域和频域的区别

空域、时域和频域是信号处理和图像处理中的三个重要概念&#xff0c;它们分别表示信号或图像在不同维度上的表示方式。 空域&#xff08;Spatial Domain&#xff09; 定义&#xff1a;空域是指图像在空间坐标上的表示。对二维图像而言&#xff0c;空域中的像素值是图像在特定…

.net8 Syncfusion生成pdf/doc/xls/ppt最新版本

新建控制台程序 添加包Syncfusion.Pdf.Net.Core包&#xff0c;当前官方的版本号为26.1.39 直接上代码 Syncfusion.Pdf.PdfDocument pdfDocument new Syncfusion.Pdf.PdfDocument(); for (int i 1; i < 10; i) {var page pdfDocument.Pages.Add();PdfGraphics graphics…

Python中vars用法

在 Python 中&#xff0c;vars() 函数返回对象的 __dict__ 属性的字典。这个字典包含了对象的所有属性和它们的值。vars() 函数可以用于模块、类、实例&#xff0c;或者拥有 __dict__ 属性的任何其它对象。这里有几个使用 vars() 的例子&#xff1a; 一.模块 如果对一个模块使…

销量位列第一!强力巨彩LED单元板成绩斐然

据全球知名科技研究机构Omdia《LED显示产品出货分析-中国-2023》报告显示&#xff0c;2023年强力巨彩LED显示屏销量与单元板产品销量均位列第一&#xff0c;其品牌和市场优势可见一斑。 厦门强力巨彩自2004年成立之初&#xff0c;便以技术创新和严格品控为核心竞争力&#xff0…

007 HTTP

文章目录 HTTP协议概述什么是HTTP协议什么是URL/URI什么是WEB资源HTTP的作用是什么 HTTP协议版本HTTP协议组成请求协议信息请求行请求方法URI协议/版本 请求头请求体 响应协议信息状态行状态码说明 响应头响应体 GET请求和POST请求的区别提交数据的方式不同使用场景不同传递参数…

Redis慢查询

Redis慢查询 目录 Redis慢查询慢查询配置慢日志操作返回参数介绍 Redis的慢查询就是当命令执行时间超过预定的阈值后将这条命令记录下来&#xff0c;与MySQL的功能类似 慢查询配置 默认阈值是10毫秒&#xff0c;即10000微秒 临时修改阈值为20毫秒 127.0.0.1:6379> confi…

汽车零部件材料耐候性测试氙光太阳辐射系统试验箱

概述 汽车零部件等领域的材料耐候性测试是一项关键的质量控制环节&#xff0c;它关乎汽车部件在各种气候条件下的性能表现和寿命。塑料件光照老化实验箱&#xff0c;即氙灯老化试验箱&#xff0c;在其中扮演着至关重要的角色。通过模拟自然环境中的光照、温度、湿度等条件&…

哈希表(C++实现)

文章目录 写在前面1. 哈希概念2. 哈希冲突3. 哈希函数4.哈希冲突解决4.1 闭散列4.1.1 线性探测4.1.2 采用线性探测的方式解决哈希冲突实现哈希表4.1.3 二次探测 4.2 开散列4.2.2 采用链地址法的方式解决哈希冲突实现哈希表 写在前面 在我们之前实现的所有数据结构中(比如&…

分享一个用于深入分析【大模型LLM】工作原理的工具

背景 LLM Transparency Tool 是一个用于深入分析和理解大型语言模型&#xff08;LLM&#xff09;工作原理的工具&#xff0c;旨在增加这些复杂系统的透明度。它提供了一个交互式界面&#xff0c;用户可以通过它观察、分析模型对特定输入&#xff08;prompts&#xff09;的反应…

Java案例找素数(三种方法)

目录 一&#xff1a;问题&#xff1a; 二&#xff1a;思路分析&#xff1a; 三&#xff1a;具体代码&#xff1a; 四&#xff1a;运行结果&#xff1a; 一&#xff1a;问题&#xff1a; 二&#xff1a;思路分析&#xff1a; 三&#xff1a;具体代码&#xff1a; Ⅰ&#xf…

硬件开发笔记(二十三):贴片电阻的类别、封装介绍,AD21导入贴片电阻原理图封装库3D模型

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140110514 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

【Mybatis 与 Spring】事务相关汇总

之前分享的几篇文章可以一起看&#xff0c;形成一个体系 【Mybatis】一级缓存与二级缓存源码分析与自定义二级缓存 【Spring】Spring事务相关源码分析 【Mybatis】Mybatis数据源与事务源码分析 Spring与Mybaitis融合 SpringManagedTransaction&#xff1a; org.mybatis.spri…