如何使用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中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 Python
安装Python的教程-Windows
Jul 22 Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 Python
python如何把字符串类型list转换成list
Feb 18 Python
利用python实现凯撒密码加解密功能
Mar 31 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
java关于string最常出现的面试题整理
Jan 18 Python
python wsgiref源码解析
Feb 06 Python
python实现b站直播自动发送弹幕功能
Feb 20 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来处理多个提交任务
2006/10/09 PHP
php程序内部post数据的方法
2015/03/31 PHP
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
Python MD5文件生成码
2009/01/12 Python
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
python数据结构树和二叉树简介
2014/04/29 Python
跟老齐学Python之关于类的初步认识
2014/10/11 Python
Python实现简单状态框架的方法
2015/03/19 Python
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
Python机器学习之决策树算法
2017/12/22 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
python中class的定义及使用教程
2019/09/18 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
C/C++程序员常见面试题二
2015/11/19 面试题
什么是测试驱动开发(TDD)
2012/02/15 面试题
历史学专业推荐信
2013/11/06 职场文书
运动会获奖感言
2014/02/11 职场文书
运动员代表致辞
2015/07/29 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript