参考:flask数据库迁移理解及命令


Flask-Migrate

使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表。就是将关系型数据库的一张张表转化成了Python的一个个类。

在开发中经常会遇到需要修改原来的数据库模型,修改之后更新数据库,最简单粗暴的方式就是删除旧表,然后在增加新表,这样做的缺点是会造成数据丢失。

使用数据库迁移,可以追踪数据库模式的变化,然后把变动应用到数据库中。

在flask中使用Flask-Migrate来实现数据库迁移,并且集成到Flask-Script中,所有的操作通过命令来完成。

为了导出数据库迁移命令,Flask-Migrate使用了一个MigrateCommand类,可以附加到Flask-Script的manager对象上。


迁移示例

1、创建迁移仓库

原始food表

希望新增一列

class Food(UserMixin, db.Model):__tablename__ = 'food'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64))addcol = db.column(db.String(64)) # 新增

全部代码 app.py

#coding:utf-8
from flask import Flask
from flask_migrate import Migrate, MigrateCommand
from flask_script import Managerfrom flask_sqlalchemy import SQLAlchemyfrom flask_login import UserMixinapp = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] ='mysql+pymysql://root:g67108864@127.0.0.1:3306/flask1?charset=utf8'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falsedb = SQLAlchemy(app)
manager = Manager(app)# 第一个参数是flask实例,第二个参数SQLAlchemy实例
Migrate(app, db)#manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
manager.add_command("db", MigrateCommand)class Role(db.Model):__tablename__ = 'roles'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64), unique=True)users = db.relationship('User', backref='role', lazy='dynamic')class User(UserMixin, db.Model):__tablename__ = 'users'id = db.Column(db.Integer, primary_key=True)email = db.Column(db.String(64), unique=True, index=True)username = db.Column(db.String(64), unique=True, index=True)role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))password_hash = db.Column(db.String(128))class Food(UserMixin, db.Model):__tablename__ = 'food'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64))addcol = db.Column(db.String(64)) addcol1 = db.Column(db.String(64))# db.create_all()@app.route("/")
def index():return "index"if __name__ == '__main__':manager.run()

运行python app.py db init
命令中的db是上面24行manager.add_command("db", MigrateCommand)设置的,也可以将db改成其他名称
这个命令会创建migrations文件夹,所有迁移文件都放在里面。只是创建了迁移仓库,表还没创建。
(配图因为我之前init过一次了,所以最后一行error)

运行后,看到生成migrations

2、创建迁移脚本

自动创建迁移脚本有两个函数
upgrade():函数把迁移中的改动应用到数据库中。
downgrade():函数则将改动删除。
自动创建的迁移脚本会根据模型定义和数据库当前状态的差异,生成upgrade()downgrade()函数的内容。
对比不一定完全正确,有可能会遗漏一些细节,需要进行检查

运行:python app.py db migrate -m 'XXX注释'

运行命令之后,只是在migrations文件夹中新增了数据库迁移的版本文件并没有在数据库也只是创建了版本号,并没有生成对应的表。

文件内容如下

3、更新数据库

更新数据库命令:python app.py db upgrade

数据库中可以看到已经创建表成功了。同时生成了一个alembic_version表,貌似是版本控制的。


总结


一点小坑和心得

一个大小写错误,查了半小时

不要看到错误就复制去百度搜,得自己阅读一下错误信息啊

而且,不要总是忽略warning,有时候warning也很重要啊。。

【Python】Flask框架系列(四):Flask-Migrate数据库迁移相关推荐

  1. php think migrate,thinkphp5 migrate数据库迁移使用详解

    这次给大家带来thinkphp5 migrate数据库迁移使用详解,thinkphp5 migrate数据库迁移使用的注意事项有哪些,下面就是实战案例,一起来看一下. tp5相对与tp3.2有很大的不 ...

  2. 【Python】Flask框架系列(一):安装、页面跳转/重定向、模板、逻辑语句、过滤器、继承/使用block、url链接/加载静态资源

    从下载安装开始的所有笔记. 其实 Flask 的示例程序算是 MVC 模式的. Model 是 ORM, V 是 Template, C 是 url route 和 request handler. ...

  3. python web框架简介Bottle Flask Tornado

    Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. ? 1 2 3 4 pip inst ...

  4. Python Web框架学习【Flask】

    了解flask flask 是利用Python编写的轻量级Web应用框架 Flask也被称为 "microframework" ,因为它使用简单的核心,用 extension 增加 ...

  5. python flask框架剖析_python flask框架实现传数据到js的方法分析

    本文实例讲述了python flask框架实现传数据到js的方法.分享给大家供大家参考,具体如下: 首先要清楚后台和前端交互所采用的数据格式. 一般选JSON,因为和js完美贴合. 后台返回的数据进行 ...

  6. 【Flask框架】一. Flask框架初体验(配置环境 + 简单demo样例)

    文章目录 一. Flask框架初体验(配置环境 + 简单demo样例) 虚拟环境 新建项目 将Pycharm改为FLASK_DEBUG模式 修改FLASK_DEBUG模式的步骤 配置文件 简单用法 U ...

  7. Entity Framework 5.0系列之Code First数据库迁移

    我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...

  8. 【Python】Flask框架系列(二):安装、配置文件、增删改查

    MySQL-python中间件的安装 打开这里链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/ 这里32与64的选择不是看操作系统的位数,而是看python ...

  9. 【Python】Flask框架系列(三):session和cookie操作、get/post请求、钩子函数

    在Flask中操作session 示例:设置session的过期时间 完整版 旧版 设置session的过期时间 示例 # encoding: utf-8from flask import Flask ...

最新文章

  1. 新产品扑朔迷离,Magic Leap又跑去收购3D扫描公司
  2. QEMU使用手册 - 1概述
  3. VUE指令篇_不常用指令
  4. cookie,sessionStorage和localStorage的区别
  5. [html] 网页中的友情链接有什么作用?
  6. 使用Redis的理由
  7. php 学习编译扩展
  8. JAVA反射性能约慢三个量级
  9. 离线版-端点检测代码重写
  10. Docker容器图形界面显示(运行GUI软件)的配置方法
  11. 军火库(第一期):无线电硬件安全大牛都用哪些利器?
  12. windows10安装Python 3.xx.xx,勾选 Download debugging symbols或Download debug binari两项安装失败解决办法
  13. 微观结构到应用材料力学行为
  14. Java使用POI将doc文档转为Html
  15. 鸿蒙 华为watch gt3手表hello world
  16. RT-Thread 软件包制作及发布流程
  17. HBase的详细介绍(概念以及特性)
  18. windows更改密码脚本_如何更改您的Windows密码
  19. Cadence创建异形焊盘教程(详细操作)
  20. mysql篇-mysql的locate函数

热门文章

  1. oracle输出异常,表导出出现异常,无法继续。
  2. AJAX DELETE
  3. JavaScript二叉搜索树
  4. BZOJ3209(n的二进制表示中1的个数的乘积)
  5. epoll背后的原理
  6. ETCD 问题、调优、监控
  7. 收藏:DPDK内存基本概念
  8. Go标准库os/exec使用指南
  9. 腾讯---生成格雷码
  10. 淘系音视频技术的演进之路