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()
相关推荐
小小测试开发3 分钟前
Python Arrow库:告别datetime繁琐,优雅处理时间与时区
开发语言·前端·python
我的xiaodoujiao10 分钟前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 18--测试框架Pytest基础 2--插件和参数化
python·学习·测试工具·pytest
程序员的奶茶馆28 分钟前
Python 数据结构面试真题:如何实现 LRU 缓存机制
python·面试
星期天要睡觉43 分钟前
深度学习——基于 ResNet18 的图像分类训练
pytorch·python·机器学习
林炳然44 分钟前
Python-Basic Day-1 基本元素(数字、字符串)
python
weixin_307779131 小时前
在Linux服务器上使用Jenkins和Poetry实现Python项目自动化
linux·开发语言·python·自动化·jenkins
【非典型Coder】1 小时前
Statement和PreparedStatement区别
数据库
今天没有盐1 小时前
内置基础类型之布尔值类型(bool)与时间与日期类型
python·编程语言
Empty_7771 小时前
Python编程之常用模块
开发语言·网络·python
Q_Q5110082851 小时前
python+uniapp基于微信小程序的学院设备报修系统
spring boot·python·微信小程序·django·flask·uni-app