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

news/2024/6/3 7:20:50 标签: flask, 数据库, python
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()

http://www.niftyadmin.cn/n/5456486.html

相关文章

Docker(二):Docker常用命令

docker 查看docker支持的所有命令和参数。 ➜ ~ docker Management Commands:config Manage Docker configscontainer Manage containersimage Manage imagesnetwork Manage networksnode Manage Swarm nodesplugin Manage pluginssecret …

OSCP靶场--law

OSCP靶场–law 考点(CVE-2022-35914 定时任务提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV 192.168.178.190 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-28 02:20 EDT Nmap scan report for 192.168.178.190 Host…

2022 Tesla AI Day -特斯拉自动驾驶FSD的进展和算法软件技术之数据以及虚拟

2022 Tesla AI Day -特斯拉自动驾驶FSD的进展和算法软件技术之数据以及虚拟 附赠自动驾驶学习资料和量产经验:链接 人工智能算法犹如电影的主演,我们很多时候看电影只看到主演们的精彩,但其实电影的创意和呈现都来自于背后的导演和制片等团队…

机器学习 - 聚类 - k_means

一、下载数据集 https://archive.ics.uci.edu/ml/datasets/ 这个库提供了大量的机器学习数据集 Iris数据集:这是一个经典的小型数据集,包含了150个样本,分为三类,每类50个样本。每个样本有四个特征,分别是花萼长度、花…

Chrome 插件 storage API 解析

Chrome.storage API 解析 使用 chrome.storage API 存储、检索和跟踪用户数据的更改 一、各模块中的 chrome.storage 内容 1. Service worker 中 runtime 内容 2. Action 中 runtime 内容 3. Content 中 runtime 内容 二、权限(Permissions) 如果需使…

一个展开和收起的业务组件(React)

index.tsx import classNames from classnames; import { useBoolean } from ahooks; import { useMemo } from react; import styles from ./index.module.less;type IProps {foldHeight?: string | number; } & React.HTMLAttributes<HTMLDivElement>;// 默认折…

就业班 第二阶段 2401--3.27 day8 shell之循环控制

七、shell编程-循环结构 shell循环-for语句 for i in {取值范围} # for 关键字 i 变量名 in 关键字 取值范围格式 1 2 3 4 5 do # do 循环体的开始循环体 done # done 循环体的结束 #!/usr/bin/env bash # # Author: # Date: 2019/…

Deconstructing Denoising Diffusion Models for Self-Supervised Learning解读(超详细)

论文题目&#xff1a;Deconstructing Denoising Diffusion Models for Self-Supervised Learning 原文链接&#xff1a;https://arxiv.org/html/2401.14404v1 本文是对何凯明老师的新作进行的详细解读&#xff0c;其中穿插了一些思考&#xff0c;将从以下四个方面对这篇工作进…