Python Flask框架 -- flask-migrate迁移ORM模型

python 复制代码
# 之前使用的这个db.create_all()很有局限性,它不能把在class里修改的东西同步上数据库,所以不用了
# with app.app_context():  # 请求应用上下文
#     db.create_all()  # 把所有的表同步到数据库中去

例如,在User类中增加一个email字段:

python 复制代码
class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(100))

运行后在数据库中刷新并没有更新:

所以这个db.create_all()很有局限性。

下面使用新方法:

首先在命令行或者在终端输入 pip install flask-migrate 安装插件,确保是安装在与项目对应的虚拟环境,所以在终端上安装不会有问题,这里我用命令行做示范:

win + R 输入 cmd 回车,然后输入上面的指令,等待安装完即可

python 复制代码
在项目开头导入才能使用
from flask_migrate import Migrate
python 复制代码
db = SQLAlchemy(app)

# 创建对象,使用它来将ORM模型映射到数据库
migrate = Migrate(app, db)

在数据库中删除这2个之前存在的表,以便看出变化:

下面正式开始:

第一步:

python 复制代码
# ORM模型映射成表的三步(在项目终端执行)
# 1.flask db init (类似于git仓库初始化),这步只需要执行一次

执行前:

执行后在项目中会多出一个文件夹migrations,这是迁移脚本初始化:

第二步:

python 复制代码
# 2.flask db migrate 识别ORM模型的改变,生成迁移脚本

执行前,versions文件夹里面是空的:

执行后就会看到versions里面生成了脚本:

第三步:

python 复制代码
# 3.flask db upgrade 运行迁移脚本,同步到数据库中

运行前数据库中为空:

运行后:

刷新数据库就可以看到同步过来的表了:

其中alembic_version是用来记录迁移脚本版本号的

此时可以看到email已经创建成功:

如果我们要新增一个字段signature:

python 复制代码
class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(100))
    signature = db.Column(db.String(100))

分别在终端执行第二第三步就行了:

python 复制代码
# 2.flask db migrate 识别ORM模型的改变,生成迁移脚本
# 3.flask db upgrade 运行迁移脚本,同步到数据库中

执行后在数据库中刷新就能看到新增的字段了:

app.py 完整代码:

python 复制代码
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)

# MySQL所在的主机名或域名
HOSTNAME = '127.0.0.1'
# MySQL监听的端口号,默认3306
PORT = 3306
# 连接MySQL的用户名,用自己的
USERNAME = 'root'
# 连接MySQL的密码,用自己的
PASSWORD = '***'
# MySQL上创建的数据库名称
DATABASE = 'database_learn'

app.config[
    'SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4'

# 在app.config中设置好连接数据库的信息
# 然后使用SQLAlchemy(app)创建一个db对象
# SQLAlchemy会自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)

# 创建对象,使用它来将ORM模型映射到数据库
migrate = Migrate(app, db)

# ORM模型映射成表的三步(在项目终端执行)
# 1.flask db init (类似于git仓库初始化),这步只需要执行一次
# 2.flask db migrate 识别ORM模型的改变,生成迁移脚本
# 3.flask db upgrade 运行迁移脚本,同步到数据库中


class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    email = db.Column(db.String(100))
    signature = db.Column(db.String(100))


# 之前使用的这个db.create_all()很有局限性,它不能把在class里修改的东西同步上数据库,所以不用了
# with app.app_context():  # 请求应用上下文
#     db.create_all()  # 把所有的表同步到数据库中去


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()
相关推荐
一叶飘零_sweeeet4 分钟前
击穿 MySQL 性能天花板:InnoDB Buffer Pool 核心架构、LRU 优化与生产调优全解
数据库·mysql
indexsunny5 分钟前
互联网大厂Java面试实战:从Spring Boot到微服务架构的深度探讨
java·数据库·spring boot·安全·微服务·监控·面试实战
一叶飘零_sweeeet6 分钟前
MySQL InnoDB 锁机制全解:行锁 / 表锁 / 间隙锁 / 临键锁底层逻辑与死锁避坑指南
数据库·mysql
wgzrmlrm747 分钟前
如何从SQL中提取年份或月份:EXTRACT与日期函数用法
jvm·数据库·python
web3.088899910 分钟前
淘宝、京东、1688 拍立淘图搜 API 均返回 JSON 格式
python·json
IT莫染19 分钟前
用脚本解放双手!我写了个WorkBuddy自动签到工具
python
d1z88820 分钟前
(十八)32天GPU测试从入门到精通-TensorRT-LLM 部署与优化day16
人工智能·python·深度学习·gpu·tensorrt
D4c-lovetrain20 分钟前
linux个人心得23 (mysql②)
数据库·mysql
qq_2837200523 分钟前
Python 面向对象编程(OOP)从入门到精通
python·oop·面对对象
linux_map26 分钟前
大模型微调实战指南
人工智能·python·ai·策略模式