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

news/2024/7/8 2:37:37 标签: flask, python, sqlalchemy, alembic

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

alembic_2">一.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 模块,然后在里面定义模型类:

python">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 中:

python">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 处理数据库迁移的示例应用程序:

python">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 增删改查

python">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.niftyadmin.cn/n/5536270.html

相关文章

通过ip获取用户位置信息以及地区时间

项目需要获取用户得位置信息以及地区时间&#xff0c;因为第一次搞&#xff0c;以防还有下次&#xff0c;特此记录 1.首先就是显得拿到用户得ip地址 先上代码&#xff1a; public boolean checkIp(String ip) {return null ip || ip.isEmpty() || "unknown".equa…

g++和 gcc 编译入门教程

GNU GNU 编译器集合&#xff08;GNU Compiler Collection&#xff0c;简称 GCC&#xff09;是一个由自由软件基金会&#xff08;Free Software Foundation&#xff0c;简称 FSF&#xff09;开发的编译器系统&#xff0c;它是 GNU 项目的一部分。GCC 支持多种编程语言&#xff…

JAVA 对象存储OSS工具类(腾讯云)

对象存储OSS工具类 import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObj…

Linux--V4L2应用程序开发(二)获取数据

一、采集数据流程 申请buffer用来放置摄像头数据 ioctl VIDIOC_REQBUFS&#xff1a;申请buffer&#xff0c;APP可以申请很多个buffer&#xff0c;但是驱动程序不一定能申请到 ioctl VIDIOC_QUERYBUF和mmap&#xff1a;查询buffer信息、映射 如果申请到了N个buffer&#xff0c…

边界无限陈佩文:红蓝对抗安全演练常态化的各方分析

虽然常态化演练尚未正式开始&#xff0c;但我们仍然希望对各方的表现进行一些分析和预测&#xff0c;以辅助我们对市场的判断和决策。同时&#xff0c;也希望通过这些初步的见解&#xff0c;抛砖引玉&#xff0c;引发更多有价值的讨论和观点。 “船停在码头是最安全的&#xf…

table = collections.defaultdict(list)申请的字典的类型是什么?

当你使用 collections.defaultdict(list) 来申请一个字典时&#xff0c;这个字典的类型是 defaultdict&#xff0c;但是其行为和表现方式在某些方面与普通的字典&#xff08;dict&#xff09;相似&#xff0c;主要区别在于它如何处理缺失的键。 defaultdict 是 Python 标准库 …

人工智能系列-numpy(一)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” Numpy是python语言的一个拓展程序库&#xff0c;支持大量的维度数组与矩阵计算&#xff0c;此外也针对数组运算提供大量的数学函数库 NumPy支持的数据类型比Python内置的类型要…

金融科技在反洗钱领域的创新应用及案例

随着金融科技的迅猛发展&#xff0c;其在反洗钱领域的应用也日益广泛和深入。这些创新应用不仅提高了反洗钱工作的效率和准确性&#xff0c;还为金融机构应对日益复杂的洗钱活动提供了有力支持。下面将详细介绍一些金融科技在反洗钱领域的创新应用案例。 一、AI大模型与知识图谱…