如何使用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计算三维矢量幅度的方法
Jun 15 Python
Python实现对excel文件列表值进行统计的方法
Jul 25 Python
matplotlib给子图添加图例的方法
Aug 03 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
Django模型中字段属性choice使用说明
Mar 30 Python
Python通过两个dataframe用for循环求笛卡尔积
Apr 29 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 Python
Python调用百度OCR实现图片文字识别的示例代码
Jul 17 Python
python3爬虫GIL修改多线程实例讲解
Nov 24 Python
Python用access判断文件是否被占用的实例方法
Dec 17 Python
pytorch 把图片数据转化成tensor的操作
Mar 04 Python
Python实现byte转integer
Jun 03 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 zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
JS查看对象功能代码
2008/04/25 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
Vue.js表单控件实践
2016/10/27 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
vue多层嵌套路由实例分析
2019/03/19 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
在vue中使用setInterval的方法示例
2019/04/16 Javascript
微信小程序云开发详细教程
2019/05/16 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
python使用分治法实现求解最大值的方法
2015/05/12 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
python自带的http模块详解
2016/11/06 Python
简单谈谈python中的多进程
2016/11/06 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
python的mysqldb安装步骤详解
2017/08/14 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
CSS3实现王者荣耀匹配人员加载页面的方法
2019/04/16 HTML / CSS
市政工程技术专业自荐书
2014/07/06 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python