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

【Flask】ORM模型以及数据库迁移的两种方法(flask-migrate、Alembic)

ORM模型

在Flask中,ORM(Object-Relational Mapping,对象关系映射)模型是指使用面向对象的方式来操作数据库的编程技术。它允许开发者使用Python类和对象来操作数据库,而不需要直接编写SQL语句。

核心概念

1. ORM模型定义

在Flask中,ORM模型通常是通过SQLAlchemy(最流行的Python ORM工具)或类似的库来定义的。一个ORM模型对应数据库中的一个表。

from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)def __repr__(self):return f'<User {self.username}>'

2. 主要特点

  • 表映射为类:每个数据库表对应一个Python类

  • 列映射为属性:表中的列对应类的属性

  • 行映射为对象:表中的每一行数据对应类的一个实例

常用字段类型

ORM类型Python类型数据库类型
db.IntegerintINTEGER
db.String(size)strVARCHAR(size)
db.TextstrTEXT
db.FloatfloatFLOAT
db.BooleanboolBOOLEAN
db.DateTimedatetime.datetimeDATETIME
db.Datedatetime.dateDATE
db.Timedatetime.timeTIME
db.LargeBinarybytesBLOB

模型关系

1. 一对多关系

class User(db.Model):id = db.Column(db.Integer, primary_key=True)posts = db.relationship('Post', backref='author', lazy=True)class Post(db.Model):id = db.Column(db.Integer, primary_key=True)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

2. 多对多关系

tags = db.Table('tags',db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),db.Column('post_id', db.Integer, db.ForeignKey('post.id'), primary_key=True)
)class Post(db.Model):id = db.Column(db.Integer, primary_key=True)tags = db.relationship('Tag', secondary=tags, lazy='subquery',backref=db.backref('posts', lazy=True))class Tag(db.Model):id = db.Column(db.Integer, primary_key=True)

基本CRUD操作

1. 创建(Create)

new_user = User(username='john', email='john@example.com')
db.session.add(new_user)
db.session.commit()

2. 读取(Read)

# 获取所有用户
users = User.query.all()# 获取单个用户
user = User.query.get(1)# 条件查询
user = User.query.filter_by(username='john').first()

3. 更新(Update)

user = User.query.get(1)
user.email = 'new@example.com'
db.session.commit()

4. 删除(Delete)

user = User.query.get(1)
db.session.delete(user)
db.session.commit()

在Flask中使用ORM模型

  1. 首先需要配置数据库URI:

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
  1. 创建数据库表:

with app.app_context():db.create_all()

优势

  1. 提高开发效率:不用写原生SQL语句

  2. 代码更易维护:数据库操作以面向对象方式进行

  3. 数据库无关性:可以轻松切换不同类型的数据库

  4. 安全性:自动处理SQL注入等安全问题

注意事项

  1. 记得在修改模型后执行数据库迁移(如使用Alembic)

  2. 批量操作时注意性能(N+1查询问题)

  3. 复杂的查询可能还是需要直接使用SQL

Flask中的ORM模型大大简化了数据库操作,使得开发者可以更专注于业务逻辑的实现。

创建外键



查询外键



 

Flask连接MySQL数据库+ORM增删改查

在Flask中,很少会使用pymysql直接写原生SQL语句去操作数据库,更多的是通过SQLAichemy提供的ORM技术,类似于操作普通Python对象一样实现数据库的增删改查操作,而Flask-SQLAlchemy是需要单独安装的,因为Flask-SQLAlchemy依赖SQLAlchemy,所以只要安装了Flask-SQLAlchemy,SQLAlchemy会自动安装。

pip install flask-sqlalchemy
# 登录数据库
mysql -u root -p
# 创建数据库(支持中文)
CREATE DATABASE database_learn DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import textapp=Flask(__name__)# 设置连接数据库的信息
HOSTNAME='127.0.0.1'
PORT=3306
USERNAME='root'
PASSWORD='123456'
DATABASE='database_learn'# 设置连接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI']=f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4'# 在app.config中设置好连接数据库的信息,然后使用SQLLichemy(app)创建一个db对象
# SQLAlchemy会自动读取app.config中连接数据库的信息db=SQLAlchemy(app)with app.app_context():with db.engine.connect() as conn:result=conn.execute(text("select 1"))print(result.fetchone())@app.route('/')
def hello_world():return 'Hello World!'if __name__ == '__main__':app.run(debug=True)


一个ORM模型与一个数据库中的一张表对应


创建数据库表


其实就是创建一个ORM模型,而且user表有属性是username和password




添加用户


查询用户



我刷新了两次add页面,所以有两个添加张三

更新用户



删除

Flask-migrate使用方法指南

 # flask-migrate迁移ORM模型
在终端中

pip install flask-migrate
flask db init
flask db migrate
flask db upgrade


自动生成。第一次创建的时候需要Init,后面再更新的话只需要后两条命令

这样就不需要再重新创建表设计表,能够直接更新表的属性

Alembic 使用方法指南

Alembic 是一个轻量级的数据库迁移工具,专门为 SQLAlchemy 设计。以下是 Alembic 的基本使用方法:

1. 安装

pip install alembic

2. 初始化

在项目目录中初始化 Alembic:

alembic init alembic

这会创建一个 alembic 目录和 alembic.ini 配置文件。

3. 配置

编辑 alembic.ini 文件,设置数据库连接:

sqlalchemy.url = driver://user:pass@localhost/dbname

或者在 alembic/env.py 中动态配置:

config.set_main_option('sqlalchemy.url', 'your-database-url')

 

4. 创建迁移脚本

自动生成迁移脚本(基于模型变更):

alembic revision --autogenerate -m "描述信息"

手动创建空迁移脚本:

alembic revision -m "描述信息"

5. 编辑迁移脚本

生成的迁移脚本位于 alembic/versions/ 目录下,包含 upgrade() 和 downgrade() 函数。

6. 执行迁移

升级到最新版本:

alembic upgrade head

升级到特定版本:

alembic upgrade <版本号>

降级到特定版本:

alembic downgrade <版本号>

7. 其他常用命令

  • 查看当前版本:

alembic current
  • 查看历史记录:

alembic history
  • 生成 SQL 而不执行(用于检查):

alembic upgrade head --sql

8. 与 Flask 集成

如果使用 Flask-SQLAlchemy,可以在 env.py 中:

from myapp import db
target_metadata = db.metadata

9. 最佳实践

  1. 每次模型变更后生成新的迁移脚本

  2. 为每个迁移编写清晰的描述信息

  3. 在团队中共享迁移脚本

  4. 在生产环境部署前测试迁移

注意事项

  • 确保模型与数据库同步

  • 自动生成迁移后检查生成的脚本是否正确

  • 对于复杂变更,可能需要手动编辑迁移脚本

希望这个指南能帮助你开始使用 Alembic 进行数据库迁移管理!

相关文章:

  • 学习路线(嵌入式软件)
  • 【C/C++】无锁编程——compare_exchange_strong
  • LeetCode 热题 100 46. 全排列
  • 为React组件库引入自动化测试:从零到完善的实践之路
  • 【CF】Day51——Codeforces Round 963 (Div. 2) CD
  • 【AI学习】DeepSeek-R1是如何训练的?
  • 我的世界Minecraft游戏服务器搭建教程:腾讯云Java版
  • 学习黑客Nmap 原理
  • 时间同步服务核心知识笔记:原理、配置
  • 【信息系统项目管理师-论文真题】2006下半年论文详解(包括解题思路和写作要点)
  • C# 检查某个点是否存在于圆扇区内(Check whether a point exists in circle sector or not)
  • 五大神经网络开发实战:从入门到企业级部署
  • 【数据结构与算法】同余计算 哈希表与前缀和问题特征和模板化思路
  • 滚珠螺杆的精度如何保持?
  • Nacos源码—3.Nacos集群高可用分析二
  • Vue中的过滤器参数:灵活处理文本格式化
  • Docker 使用下 (二)
  • 知识图谱 + 大语言模型:打造更聪明、更可靠的AI大脑 —— 探索 GraphRAG 中文优化与可视化实践
  • VirtualBox调整虚拟机内存和CPU
  • 数据库的原子事务
  • 以总理:在加沙地带扩大的军事行动将是“高强度”的
  • 人民日报和音:引领新时代中俄关系坚毅前行
  • 五一假期上海多个景点人流如织,警方多措并举确保秩序
  • 2025年五一档电影票房破4亿,《水饺皇后》领跑
  • 人民日报:上海“模速空间”何以汇聚超百家大模型企业
  • 魔都眼|买买买,老铺黄金新店开业被挤爆:有人排队5小时