如何使用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脚本实现分析dns日志并对受访域名排行
Sep 18 Python
python实现线程池的方法
Jun 30 Python
python实现文本文件合并
Dec 29 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
Jul 04 Python
python中pip的安装与使用教程
Aug 10 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
Python 函数list&read&seek详解
Aug 28 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
Django 自定义权限管理系统详解(通过中间件认证)
Mar 11 Python
什么是Python中的匿名函数
Jun 02 Python
浅谈matplotlib默认字体设置探索
Feb 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 zip文件解压类代码
2009/12/02 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
PDO::inTransaction讲解
2019/01/28 PHP
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
分享一些常用的jQuery动画事件和动画函数
2015/11/27 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
2018/04/04 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
Python+Wordpress制作小说站
2017/04/14 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
优秀班组长事迹
2014/05/31 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
销售会议开幕词
2015/01/28 职场文书
人事文员岗位职责
2015/02/04 职场文书
党员转正介绍人意见
2015/06/03 职场文书
幼儿体育课教学反思
2016/02/16 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js