【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 SQLAlchemy

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

app=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 进行数据库迁移管理!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海绵波波107

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值