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()
相关推荐
老毛肚2 小时前
jeecg-boot-base-core 02 day
javascript·python
yaoxin5211232 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
岁月宁静3 小时前
RAG 文档摄入全链路,从原理到生产落地
vue.js·人工智能·python
火山上的企鹅3 小时前
Codex实战:APP远程升级服务搭建(三)后台管理页面(APK 上传、版本管理、多应用页签)
服务器·网络·数据库·oracle·qgc
JaydenAI3 小时前
[对比学习LangChain和MAF-07]如何引入人机交互的审批流程
python·ai·langchain·c#·agent·hitl·maf
阿狸猿4 小时前
论 NoSQL 数据库技术及其应用
数据库·nosql
神奇元创4 小时前
商用级光路加速卡:大模型推理的极速落地方案
python·神经网络·fpga开发·dsp开发
FBI HackerHarry浩4 小时前
DataGrip2023.2.3默认保存的数据库和.sql文件在哪里?怎么修改默认路径?
数据库
袁小皮皮不皮4 小时前
3.HCIP OSPF补充知识(优化版)
服务器·网络·数据库·网络协议·智能路由器