当前位置: 首页 > 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 进行数据库迁移管理!

http://www.xdnf.cn/news/288019.html

相关文章:

  • 【全队项目】智能学术海报生成系统PosterGenius--前后端系统介绍
  • Vuex使用指南:状态管理
  • Leetcode:回文链表
  • GGD独立站的优势
  • 备战蓝桥杯国赛第一天-atcoder-beginner-contest404
  • Python异步编程进阶:深入探索asyncio高级特性
  • 从零开始开发纯血鸿蒙应用之NAPI
  • Linux的web服务器的部署及优化
  • 关于浏览器页面自动化操作
  • Python 矩阵运算:从理论到实践
  • 五大神经网络开发实战:从入门到企业级部署
  • 《Python星球日记》第30天:Flask数据库集成
  • 虚幻基础:硬件输入
  • 蓝桥杯 19. 植树
  • 【题解-洛谷】B4303 [蓝桥杯青少年组省赛 2024] 字母移位
  • [HOT 100] 2538. 最大价值和与最小价值和的差值
  • LabVIEW伺服电机故障监测系统
  • 【QT】QT中的事件
  • JavaSE笔记--反射篇
  • Cron表达式的用法
  • cudaMalloc函数说明
  • 5.5刷题map和set的使用
  • 笔试专题(十五)
  • 3小时超快速入门Python
  • 字符串,数组,指针之间的关系
  • Python实现自动驾驶中的车道检测算法:从理论到实践
  • win10开了移动热点,手机无法连接,解决办法(chatgpt版)
  • 手机SIM卡打电话时识别对方按下的DTMF按键(二)
  • SpringBoot整合RabbitMQ(Java注解方式配置)
  • CMake基础介绍