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

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

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

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 回车,然后输入上面的指令,等待安装完即可

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

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

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

下面正式开始:

第一步:

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

执行前:

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

    

第二步:

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

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

 

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

第三步:

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

运行前数据库中为空:

运行后:

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

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

     

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

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

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))

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

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

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

app.py 完整代码:

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.mfbz.cn/a/488166.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.6 IDE(集成开发环境)是什么

IDE(集成开发环境)是什么 IDE 是 Integrated Development Environment 的缩写,中文称为集成开发环境,用来表示辅助程序员开发的应用软件,是它们的一个总称。 通过前面章节的学习我们知道,运行 C 语言&…

各大pdf转word软件都用的哪家的ocr引擎?

国内一般的PDF软件一般都调用某国际PDF原厂的OCR接口,但这家公司是主要做PDF,在OCR方面并不专注,一些不是很复杂的场景还能应付得过来,复杂一点的效果就强差人意了,推荐用金鸣表格文字识别系统,它主要有以下…

基于CNN-RNN的动态手势识别系统实现与解析

一、环境配置 为了成功实现基于CNN-RNN的动态手势识别系统,你需要确保你的开发环境已经安装了以下必要的库和工具: Python:推荐使用Python 3.x版本,作为主要的编程语言。TensorFlow:深度学习框架,用于构建…

ElementPlus Upload组件使用compressorjs压缩图片上传

需求 Compressor.js 是一个用于在客户端(即在浏览器中)对图片进行压缩的 JavaScript 库。使用它有以下几个优点和意义: 减少文件大小: 图片通常是网页中占用大量带宽的资源之一。通过使用 Compressor.js 对图片进行压缩,可以显著…

力扣面试150 直线上最多的点数 数学 直线斜率 欧几里得求最大公约数

Problem: 149. 直线上最多的点数 思路 👨‍🏫 参考题解 💖 枚举直线 枚举统计 时间复杂度: O ( n 3 ) O(n^3) O(n3) 空间复杂度: O ( 1 ) O(1) O(1) class Solution {public int maxPoints(int[][] points){int n points.length;int…

数据库之备份与恢复

MySQL完全备份与恢复 数据备份的重要性 在生产环境中,数据的安全性至关重要任何数据的丢失都可能产生严重的后果造成数据丢失的原因 程序错误 人为操作错误 运算错误 磁盘故障 灾难(如火灾、地震)和盗窃 数据库备份的分类 物理角度 物理备份:对数据库操作系统的…

【网络爬虫】(1) 网络请求,urllib库介绍

各位同学好,今天开始和各位分享一下python网络爬虫技巧,从基本的函数开始,到项目实战。那我们开始吧。 1. 基本概念 这里简单介绍一下后续学习中需要掌握的概念。 (1)http 和 https 协议。http是超文本传输&#xf…

Visual Studio项目编译和运行依赖第三方库的项目

1.创建项目,这里创建的项目是依赖于.sln的项目,非CMake项目 2.添加第三方库依赖的头文件和库文件路劲 3.添加第三方依赖库文件 4.项目配置有2个,一个是Debug,一个是Release,如果你只配置了Debug,编译和运行…

厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能原理篇

接着上一篇《厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能结构篇》继续总结一下厨余垃圾处理设备智能软硬件统的原理。所有的软硬件系统全是自己一人独自开发,看法和角度难免有局限性。希望抛砖引玉,将该智能软硬件系统分享给更多有类…

java的封装

封装概述 java中的封装指的是将一系列有关的事物的共同属性和行为提取出来放到一个类中,隐藏对象的实行和现实细节,仅对外提供公共的访问方式的操作。这样说起来感觉很抽象,也不好理解,这里不妨举一个例子。将配置电脑这个动作看成…

伪装目标检测之注意力CBAM:《Convolutional Block Attention Module》

论文地址:link 代码:link 摘要 我们提出了卷积块注意力模块(CBAM),这是一种简单而有效的用于前馈卷积神经网络的注意力模块。给定一个中间特征图,我们的模块依次推断沿着两个独立维度的注意力图&#xff…

Qt实现简易的多线程TCP服务器(支持多个客户端连接)附源码

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化,m_widget我们用于后续的显示消息等,说白了就是主界面的更新显示等 …

为何ChatGPT日耗电超50万度?

看新闻说,ChatGPT每天的耗电量是50万度,国内每个家庭日均的耗电量不到10度,ChatGPT耗电相当于国内5万个家庭用量。 网上流传,英伟达创始人黄仁勋说:“AI的尽头是光伏和储能”,大佬的眼光就是毒辣&#xff…

使用LLaVA模型实现以文搜图和以图搜图

本文将会详细介绍如何使用多模态模型——LLaVA模型来实现以文搜图和以图搜图的功能。本文仅为示例Demo,并不能代表实际的以文搜图和以图搜图的技术实现方案。 1、实现原理 使用多模态模型获取图片的标题和详细描述以文搜图功能:使用ES实现查询匹配&…

深入了解 Linux 中的 MTD 设备:/dev/mtd* 与 /dev/mtdblock*

目录 前言一、什么是MTD子系统?二、 /dev/mtd* 设备文件用途注意事项 三、/dev/mtdblock* 设备文件用途注意事项 三、这两种设备文件的关系四、关norflash的一些小知识 前言 在嵌入式Linux系统的世界里,非易失性存储技术扮演着至关重要的角色。MTD&#…

面试知识汇总——垃圾回收器(分代收集算法)

分代收集算法 根据对象的存活周期,把内存分成多个区域,不同区域使用不同的回收算法回收对象。 对象在创建的时候,会先存放到伊甸园。当伊甸园满了之后,就会触发垃圾回收。 这个回收的过程是:把伊甸园中的对象拷贝到F…

初识redis(一)

前言 引用的是这本书的原话 Redis[1]是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、list(列…

Android15功能和 API 概览

Android 15 面向开发者引入了一些出色的新功能和 API。以下部分总结了这些功能,以帮助您开始使用相关 API。 如需查看新增、修改和移除的 API 的详细列表,请参阅 API 差异报告。如需详细了解新的 API,请访问 Android API 参考文档&#xff0…

Selenium 自动化 —— 定位页面元素

更多内容请关注我的 Selenium 自动化 专栏: 入门和 Hello World 实例使用WebDriverManager自动下载驱动Selenium IDE录制、回放、导出Java源码浏览器窗口操作切换浏览器窗口 使用 Selenium 做自动化,我们不仅仅是打开一个网页,这只是万里长…

Stable Diffusion 进阶教程 - 二次开发(制作您的文生图应用)

目录 1. 引言 2. 基于Rest API 开发 2.1 前置条件 2.2 代码实现 2.3 效果演示 2.4 常见错误 3. 总结 1. 引言 Stable Diffusion作为一种强大的文本到图像生成模型,已经在艺术、设计和创意领域引起了广泛的关注和应用。然而,对于许多开发者来说&#xff…