数据库迁移

  • 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。
  • 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。
  • 在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。
  • 为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可以附加到flask-script的manager对象上。

首先要在虚拟环境中安装Flask-Migrate。

pip install flask-migrate
  • 代码文件内容:
#coding=utf-8
from flask import Flaskfrom flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate,MigrateCommand
from flask_script import Shell,Managerapp = Flask(__name__)
manager = Manager(app)app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)#第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例
migrate = Migrate(app,db) #manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
manager.add_command('db',MigrateCommand)#定义模型
#书籍表
class BookInfo(db.Model):#设置表名__tablename__ = 'bookinfo'#设置为主键之后,自动自增长id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(20),unique=True,nullable=False)pub_date = db.Column(db.Date,nullable=True)readcount = db.Column(db.Integer,default=1)commentcount = db.Column(db.Integer,default=1)is_delete = db.Column(db.Boolean,default=False)peopleinfo_set = db.relationship('PeopleInfo',backref='book',lazy='dynamic')def __repr__(self):return self.name
#人物表
class PeopleInfo(db.Model):__tablename__ = 'peopleinfo'id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(20),unique=True)password = db.Column(db.String(20),nullable=False)email = db.Column(db.String(50),nullable=True)#设置外键book_id = db.Column(db.Integer,db.ForeignKey('bookinfo.id'))def __repr__(self):return self.nameif __name__ == '__main__':manager.run()

创建迁移仓库

#这个命令会创建migrations文件夹,所有迁移文件都放在里面。
python database.py db init

创建迁移脚本

  • 自动创建迁移脚本有两个函数

    • upgrade():函数把迁移中的改动应用到数据库中。
    • downgrade():函数则将改动删除。
  • 自动创建的迁移脚本会根据模型定义和数据库当前状态的差异,生成upgrade()和downgrade()函数的内容。
  • 对比不一定完全正确,有可能会遗漏一些细节,需要进行检查
python database.py db migrate -m 'initial migration'

更新数据库

python database.py db upgrade

返回以前的版本

可以根据history命令找到版本号,然后传给downgrade命令:

python app.py db history输出格式:<base> ->  版本号 (head), initial migration
  • 回滚到指定版本
python app.py db downgrade 版本号

实际操作顺序:

  • 1.python 文件 db init
  • 2.python 文件 db migrate -m"版本名(注释)"
  • 3.python 文件 db upgrade 然后观察表结构
  • 4.根据需求修改模型
  • 5.python 文件 db migrate -m"新版本名(注释)"
  • 6.python 文件 db upgrade 然后观察表结构
  • 7.若返回版本,则利用 python 文件 db history查看版本号
  • 8.python 文件 db downgrade(upgrade) 版本号

flask中数据库迁移相关推荐

  1. Flask框架(flask-script扩展命令行和flask中数据库migrate扩展的使用)

    flask-script扩展命令行 1. 安装  : pip install  Flask-Script 2. 在程序中   from flask_script import Manager   '' ...

  2. Flask--02(flask中数据库相关+书籍管理案例)

    一.数据库的设置 Web应用中普遍使用的是关系模型的数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,行数是可变的.它使用结构化的查询语言.关系型数据库的列定义了 ...

  3. Flask中数据库基本操作,十分钟就掌握了

    在Flask-SQLAlchemy中,插入.修改.删除操作,均由数据库会话管理. 会话用 db.session 表示.在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提 ...

  4. Flask中数据库的应用

    一.配置SQLAlchemy 1.安装包 pip install flask-sqlalchemy pip install pymysql 2.配置数据库 a)配置SQLALCHEMY_DATABAS ...

  5. flask中数据库的基本操作-增删改查【备忘】

    1.增加数据(就相当于增加一个实例对象)   user1 = User(name='long',email='1006550026@qq.com',password='123456',role_id= ...

  6. laravel 框架中使用数据库迁移添加注释

    laravel 框架中数据库迁移添加注释 在使用laravel框架过程中,估计很多人都有用过数据库迁移文件.可能大家都会在建表时为字段添加注释.我在此要说明的是为表添加注释 首先我们需要引入larav ...

  7. Flask 中的数据库迁移

    Flask 中的数据库迁移 在我之前使用 Flask 实现简单接口时,为了方便,我每次都会将数据表删除掉,然后重新创建表和添加数据.因为测试数据只有几条,所以可以使用删表重建的方式,但在实际的项目中, ...

  8. 简单分析Flask 数据库迁移详情

    本文给大家分享的是 Flask 数据库迁移详情,db.create_all()不会重新创建表或是更新表,需要先使用db.drop_all()删除数据库中所有的表之后再调用db.create_all() ...

  9. flask数据库迁移理解及命令

    前言: 使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表.就是将关系型数据库的一张张表转化成了Python的一个个类. 在开发中经常会遇到需要修改原来的数据库模型,修改之后更新数据库, ...

最新文章

  1. 3D视觉检测的未来:光度立体技术
  2. NOIP2017 小凯的疑惑
  3. 从LabVIEW到C++
  4. 【Android】换肤技术讲解
  5. linux gcc出错,编译arm-linux-gcc出错
  6. ASP如何限定中英文混合的文字输出字数?
  7. html表白照片墙,【原创】【申精】用python去告白 绘制照片墙(自定义格式)
  8. 开放Nginx在文件夹列表功能
  9. Telnet 服务器软件的安装
  10. 安装CentOS 7.4 操作系统
  11. 计算机提示资源管理器停止,windows资源管理器已停止工作,教您提示win资源管理器已停止工作...
  12. SICP练习1.16
  13. sybase 快速删除大数据库的手顺方法
  14. C#--解方程组之Jacobi迭代法
  15. 【Unity Shader】关于Stencil的理解小记
  16. Redis-5.0.5集群配置
  17. QQ登录提示:登录超时,请检查您的网络或者本机防火墙设置(错误码:0x00000001)
  18. linux命令lha用法详解
  19. 草图大师怎么渲染全景图?Sketchup渲染全景图的操作办法和方式!
  20. Android 接入华为通知栏推送教程(特此整理)

热门文章

  1. zabbix 启动报cannot connect to Service Manager: [0x00000005]解决方法
  2. 配置远程服务器的别名
  3. StringBuffer 和 StringBuilder 的 3 个区别
  4. 使用框架注意事项:vue-react
  5. 七、Framework类库
  6. BZOJ 3038: 上帝造题的七分钟2【线段树区间开方问题】
  7. 让你变成优秀程序员的几个小习惯
  8. 修改 Mac 版 Safari、Chrome、FireFox、Opera 的 User-Agent
  9. 谷歌帮助开发人员面向教育应用
  10. Macbook pro wifi连接无线路由不稳定掉线的解决办法