如何使用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的源码浅要剖析Python的内存管理
Apr 16 Python
python 中的divmod数字处理函数浅析
Oct 17 Python
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
Jun 14 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
Python 读取WAV音频文件 画频谱的实例
Mar 14 Python
教你用python实现一个无界面的小型图书管理系统
May 21 Python
Python实现双向链表
May 25 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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中通过curl检测页面是否被百度收录
2013/09/27 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
2016/07/01 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
canvas绘制七巧板
2017/02/03 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
python安装以及IDE的配置教程
2015/04/29 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
python3实现163邮箱SMTP发送邮件
2018/05/22 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
pytorch进行上采样的种类实例
2020/02/18 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
关于梦想的演讲稿
2014/05/05 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
基层党组织整改方案
2014/10/25 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL