如何使用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中列表和元组的使用方法和区别详解
Dec 30 Python
Python 文件处理注意事项总结
Apr 10 Python
对python3 urllib包与http包的使用详解
May 10 Python
python破解zip加密文件的方法
May 31 Python
详解python单元测试框架unittest
Jul 02 Python
Python3模拟登录操作实例分析
Mar 12 Python
django使用admin站点上传图片的实例
Jul 28 Python
python支持多线程的爬虫实例
Dec 21 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
mac使用python识别图形验证码功能
Jan 10 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
获取CSDN文章内容并转换为markdown文本的python
Sep 06 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
phpmyadmin的#1251问题
2006/11/25 PHP
Cakephp 执行主要流程
2010/03/24 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
什么是DOM(Document Object Model)文档对象模型
2012/03/05 Javascript
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
vue实现后台管理权限系统及顶栏三级菜单显示功能
2019/06/19 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
外贸实习生自荐信范文
2013/11/24 职场文书
售后专员岗位职责
2013/12/08 职场文书
心理健康教育制度
2014/01/27 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
2015年植树节活动总结
2015/02/06 职场文书
各种货币符号快捷输入
2022/02/17 杂记
详解MySQL的内连接和外连接
2023/05/08 MySQL