如何使用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中的Cookie模块使用
Jul 06 Python
Python守护进程和脚本单例运行详解
Jan 06 Python
浅谈Django REST Framework限速
Dec 12 Python
python队列通信:rabbitMQ的使用(实例讲解)
Dec 22 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
Feb 18 Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
Mar 11 Python
python判断是空的实例分享
Jul 06 Python
几款好用的python工具库(小结)
Oct 20 Python
python中用ctypes模拟点击的实例讲解
Nov 26 Python
Spy++的使用方法及下载教程
Jan 29 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 分页类(模仿google)-面试题目解答
2009/09/13 PHP
php的urlencode()URL编码函数浅析
2011/08/09 PHP
解析如何用php screw加密php源代码
2013/06/20 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
JavaScript结合HTML DOM实现联动菜单
2017/04/05 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
python+pygame简单画板实现代码实例
2017/12/13 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
django模型动态修改参数,增加 filter 字段的方式
2020/03/16 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
大学自主招生自荐信范文
2014/02/26 职场文书
优秀教师申报材料
2014/12/16 职场文书
公司酒会致辞
2015/07/30 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js