如何使用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实现子类调用父类的方法
Nov 10 Python
python爬虫基本知识
Mar 05 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 Python
pip安装python库的方法总结
Aug 02 Python
Python操作qml对象过程详解
Sep 26 Python
python安装gdal的两种方法
Oct 29 Python
python scatter函数用法实例详解
Feb 11 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
Feb 20 Python
python如何查看网页代码
Jun 07 Python
Python 实现键盘鼠标按键模拟
Nov 18 Python
matplotlib对象拾取事件处理的实现
Jan 14 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
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
jQuery设置与获取HTML,文本和值的简单实例
2014/02/26 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
AngularJS 让人爱不释手的八种功能
2016/03/23 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
python常见的格式化输出小结
2016/12/15 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
详解Python用户登录接口的方法
2019/04/17 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
python之语音识别speech模块
2020/09/09 Python
CSS3制作ajax loader icon实现思路及代码
2013/08/25 HTML / CSS
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
比较一下entity bean和session bean
2013/12/27 面试题
应届毕业生的个人自我鉴定
2013/10/24 职场文书
银行开业庆典方案
2014/02/06 职场文书
禁止酒驾标语
2014/06/25 职场文书
项目合作协议书
2014/09/23 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
《春酒》教学反思
2016/02/22 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS