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

news2024/12/26 3:40:21

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_base

Base = 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 Migrate

app = Flask(__name__)
# app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_DATABASE_URI'] = mysql+mysqldb://root:password@localhost:4306/alembic?charset=utf8

db = 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 jsonify

app = 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.Model
    id = 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.coloradmin.cn/o/1883418.html

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

相关文章

鸿蒙本地签名不匹配问题

连接鸿蒙手机运行项目报如下错误 这是由于本地签名和鸿蒙设备签名不匹配导致的&#xff0c;需要注释掉如下代码&#xff0c;选择file project 自动签名 勾选auto选项&#xff0c;会在build-profile.json5中生成一个签名&#xff0c;然后运行就ok了~

商汤上海AI实验室联合发布:自动驾驶全栈式高精度标定工具箱(含车、IMU、相机、激光雷达等的标定)

前言 在自动驾驶技术飞速发展的今天&#xff0c;传感器的精确标定对于确保系统性能至关重要。SensorsCalibration&#xff0c;一个专为自动驾驶车辆设计的标定工具箱&#xff0c;提供了一套全面的解决方案&#xff0c;用于校准包括IMU、激光雷达、摄像头和雷达在内的多种传感器…

探索智慧校园人事系统,了解人事合同功能的核心优势

智慧校园人事系统中的人事合同管理功能&#xff0c;是一个高度集成且自动化的模块&#xff0c;专注于优化合同的全生命周期管理&#xff0c;从合同创建、审批、签署到存档及续签提醒&#xff0c;旨在提升人事管理工作的规范性与效率&#xff0c;同时保障学校的法律合规性。 在智…

ARP 原理详解 一

ARP 原理 ARP&#xff08;Address Resolution Protocol&#xff09;地址解析协议&#xff0c;是根据 IP 地址获取物理地址的一个 TCP/IP 协议。 OSI 网络七层模型中&#xff0c;IP 地址在 OSI 模型第三层&#xff0c;MAC 地址在第二层&#xff0c;彼此不直接通信。 在通过以…

HTMLCSS(入门)

HTML <html> <head><title>第一个页面</title></head><body>键盘敲烂&#xff0c;工资过万</body> </html> <!DOCTYPE>文档类型声明&#xff0c;告诉浏览器使用哪种HTML版本显示网页 <!DOCTYPE html>当前页面采取…

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

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

分享一个在 WinForm 桌面程序中使用进度条展示报表处理进度的例子,提升用户体验

前言 在有些比较消耗时间的业务场景中&#xff0c;比如生成报表等&#xff0c;如果没有在操作的过程中向用户反馈操作进度&#xff0c;会让用户以为程序 “死” 掉了&#xff0c;用户体验非常不好。 WinForm 桌面程序项目与 Console 项目不一样&#xff0c;如果 Console 项目…

农村程序员陈随易2024年中总结

今天是 2024年7月1日&#xff0c;时间如白驹过隙&#xff0c;今年已去其一半。 总结一下今年上半年的情况&#xff0c;给大家提供一些参考和建议。 希望大家关注一下公众号 陈随易&#xff0c;有些内容只在公众号发表。 先看看我的年初计划&#xff0c;这个在今年年初的时候&…

【解锁未来:深入了解机器学习的核心技术与实际应用】

解锁未来&#xff1a;深入了解机器学习的核心技术与实际应用 &#x1f48e;1.引言&#x1f48e;1.1 什么是机器学习&#xff1f; &#x1f48e;2 机器学习的分类&#x1f48e;3 常用的机器学习算法&#x1f48e;3.1 线性回归&#xff08;Linear Regression&#xff09;&#x1…

141个图表,完美展示数据分类别关系!

本文介绍使用Python工具seaborn详细实现分类关系图表&#xff0c;包含8类图141个代码模版。 分类关系图表用于展示数字变量和一个或多个分类变量之间的关系&#xff0c;可以进一步分为&#xff1a;箱形图&#xff08;box plot&#xff09;、增强箱形图&#xff08;enhanced bo…

C++进阶 | [4.3] 红黑树

摘要&#xff1a;什么是红黑树&#xff0c;模拟实现红黑树 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red 或 Black 。 通过对 任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树…

创建XCOM窗体和跳转连接

Xcom 窗体&#xff1a; (groupBox组合框&#xff0c;comboBox下拉框) xcom代码&#xff1a; namespace _01_作业 {// 1kb 1024B 1200B// 1MB public partial class Form1 : Form{public List<string> botelv new List<string> { "600","1200&…

基于Tools体验NLP编程的魅力

大模型能理解自然语言&#xff0c;从而能解决问题&#xff0c;但是就像人类大脑一样&#xff0c;大脑只能发送指令&#xff0c;实际行动得靠四肢&#xff0c;所以LangChain4j提供的Tools机制就是大模型的四肢。 大模型的不足 大模型在解决问题时&#xff0c;是基于互联网上很…

图像大模型中的注意力和因果掩码

AIM — 图像领域中 LLM 的对应物。尽管 iGPT 已经存在 2 年多了&#xff0c;但自回归尚未得到充分探索。在本文中&#xff0c;作者表明&#xff0c;当使用 AIM 对网络进行预训练时&#xff0c;一组图像数据集上的下游任务的平均准确率会随着数据和参数的增加而线性增加。 要运…

Android 大话binder通信

戳蓝字“牛晓伟”关注我哦&#xff01; 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章 由于 Android 大话binder通信(上) 和 Android 大话binder通信(下) 分为两篇阅读体验不好&#xff0c;顾合并为一篇。 本文摘要 用故事的方式把binder通信的整个过程都描述…

机械原理介绍

机械原理介绍 1 介绍1.1 概述1.2 资料书籍在线资料 2 [机械原理知识整理](https://tomm.muzing.top/) 【muzing整理编写】1 绪论2 机构的结构分析2-2 机构的组成及分类2-3 机构运动简图2-4 机构具有确定运动的条件及最小阻力定律2-5 2-6 机构自由度的计算2-7 平面机构的组成原理…

【深度学习】图生图img3img论文原理,SD EDIT

https://arxiv.org/abs/2108.01073 摘要 引导图像合成技术使普通用户能够以最小的努力创建和编辑逼真的图像。关键挑战在于平衡对用户输入&#xff08;例如&#xff0c;手绘的彩色笔画&#xff09;的忠实度和合成图像的真实感。现有的基于GAN的方法试图通过使用条件GAN或GAN反…

64.WEB渗透测试-信息收集- WAF、框架组件识别(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;63.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;3&#xff09;-CSDN博客 我们在…

面经-计算机基础

1.计算机⽹络 1.1 OSI与TCP/IP各层的结构与功能,都有哪些协议? 计算机网络体系结构 应⽤层 应⽤层 (application-layer &#xff09;的任务是通过应⽤进程间的交互来完成特定⽹络应⽤。 应⽤层协议定 义的是应⽤进程&#xff08;进程&#xff1a;主机中正在运⾏的程序&…

便签 Pro(Mac 智能便签工具)专业版怎么样,值得购买吗?

使用 Mac 的小伙伴平时都是怎么记录工作生活中的碎片信息&#xff1f;用聊天软件&#xff0c;还是系统备忘录呢&#xff1f; 实际体验下来&#xff0c;其实都难以称得上好用。 赶紧来了解一下 Mac 多彩思维速记工具便签 Pro&#xff01;拥有智能边框大小、iCloud 同步、历史记…