如何使用Flask-Migrate拓展数据库表结构


Posted in Python onJuly 24, 2019

前言

在我们用 sqlchemy 模块创建完几个表时,如果在实际生产环境中,需要对表结构进行更改,应该怎么办呢?总不能把表删除了吧,这样数据就会丢失了。

更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。

在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。

操作示例:

1.首先需要安装 flask-migrate 模块,当然还有 flask-script 模块。

pip3 install flask-migrate
pip3 install flask-script

2.代码:

#coding=utf-8
from flask import Flask

from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate,MigrateCommand
from flask_script import Shell,Manager

app = Flask(__name__)
manager = Manager(app)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/Flask_test'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)

#第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例
migrate = Migrate(app,db) 

#manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
manager.add_command('db',MigrateCommand)

#定义模型Role
class Role(db.Model):
  # 定义表名
  __tablename__ = 'roles'
  # 定义列对象
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(64), unique=True)
  user = db.relationship('User', backref='role')

  #repr()方法显示一个可读字符串,
  def __repr__(self):
    return 'Role:'.format(self.name)

#定义用户
class User(db.Model):
  __talbe__ = 'users'
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(64), unique=True, index=True)
  #设置外键
  role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

  def __repr__(self):
    return 'User:'.format(self.username)


if __name__ == '__main__':
  manager.run()

主要注意第8行-20行,48行。要把原来的代码改成这样。

3.命令行的操作

创建迁移仓库

这个命令会创建 migirations 文件夹,所有迁移文件都放在里面

python3 xxx.py db init

注:db 是20行决定了,可以更改

自动创建迁移脚本

python3 xxx.py db migrate -m"版本名(注释)"

更新数据库

python3 xxx.py db upgrade

当我们需要修改表结构时,直接在 xxx.py 里直接增删相应的代码

修改完成后,继续创建新的迁移脚本

python 文件 db migrate -m"新版本名(注释)"

更新数据库

python3 xxx.py db upgrade

更新完之后,其实就是提交操作,类似于 git 添加一个新的版本。

但是,如果我们想返回历史的版本,应该怎么操作呢?

先查看版本号

python xxx.py db history

然后记住想要返回的版本号。

返回指定的版本

python xxx.py db downgrade(upgrade) 版本号

然后打开你的代码,可以发现他自动复原了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
python如何压缩新文件到已有ZIP文件
Mar 14 Python
Python基于sklearn库的分类算法简单应用示例
Jul 09 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
Python循环结构的应用场景详解
Jul 11 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
python 中不同包 类 方法 之间的调用详解
Mar 09 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
django数据模型中null和blank的区别说明
Sep 02 Python
python输入中文的实例方法
Sep 14 Python
如何利用python实现Simhash算法
Jun 28 Python
Python定时任务工具之APScheduler使用方式
Jul 24 #Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 #Python
Django的用户模块与权限系统的示例代码
Jul 24 #Python
python3字符串操作总结
Jul 24 #Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 #Python
django如何自己创建一个中间件
Jul 24 #Python
django如何通过类视图使用装饰器
Jul 24 #Python
You might like
php字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
php输出表格的实现代码(修正版)
2010/12/29 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
php文件操作相关类实例
2015/06/18 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
twig里使用js变量的方法
2016/02/05 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
2011/10/29 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
微信小程序 picker-view 组件详解及简单实例
2017/01/10 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
2017/07/09 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
Python3写入文件常用方法实例分析
2015/05/22 Python
python实现下载指定网址所有图片的方法
2015/08/08 Python
详解python之简单主机批量管理工具
2017/01/27 Python
django允许外部访问的实例讲解
2018/05/14 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
工业自动化毕业生自荐信范文
2014/01/04 职场文书
优秀信贷员先进事迹
2014/01/31 职场文书
小学清明节活动总结
2014/07/04 职场文书
党支部审查意见
2015/06/02 职场文书
争做文明公民倡议书
2019/06/24 职场文书
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android