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

发布于:2025-05-09 ⋅ 阅读:(18) ⋅ 点赞:(0)

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.Integer int INTEGER
db.String(size) str VARCHAR(size)
db.Text str TEXT
db.Float float FLOAT
db.Boolean bool BOOLEAN
db.DateTime datetime.datetime DATETIME
db.Date datetime.date DATE
db.Time datetime.time TIME
db.LargeBinary bytes BLOB

模型关系

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


网站公告

今日签到

点亮在社区的每一天
去签到