如何使用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 中 Meta Classes详解
Feb 13 Python
Python中的变量和作用域详解
Jul 13 Python
python统计多维数组的行数和列数实例
Jun 23 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
Python列表list排列组合操作示例
Dec 18 Python
Python使用for生成列表实现过程解析
Sep 22 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 Python
python 实现IP子网计算
Feb 18 Python
Python 里最强的地图绘制神器
Mar 01 Python
Python源码解析之List
May 21 Python
Python 中random 库的详细使用
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下MYSQL limit的优化
2008/01/10 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
PHP常用编译参数中文说明
2014/09/27 PHP
php制作文本式留言板
2015/03/18 PHP
基于jQuery的自动完成插件
2011/02/03 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
python logging类库使用例子
2014/11/22 Python
在Python中操作字典之fromkeys()方法的使用
2015/05/21 Python
python创建列表并给列表赋初始值的方法
2015/07/28 Python
python文件的md5加密方法
2016/04/06 Python
python实现电子产品商店
2019/02/26 Python
Python 函数返回值的示例代码
2019/03/11 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
公司廉洁自律承诺书
2014/03/27 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
2015入党自荐书范文
2015/03/05 职场文书
详解NodeJS模块化
2021/06/15 NodeJs