Flask框架从入门到精通之模型迁移操作(十六)

栏目: Python · 发布时间: 5年前

内容简介:在Django框架开发过程中,我们对数据库字段添加或删除,直接修改模型类,然后进行迁移可以了,非常方便。我们也想让Flask框架支持这样的操作,就需要使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可以附加到flask-script的manager对象上。 先安装下面两个扩展:首先我们通过命令创建出migrations文件夹,后面所有的迁移文件都会放

在Django框架开发过程中,我们对数据库字段添加或删除,直接修改模型类,然后进行迁移可以了,非常方便。我们也想让Flask框架支持这样的操作,就需要使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。

二、安装

为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可以附加到flask-script的manager对象上。 先安装下面两个扩展:

pip install Flask-Script
复制代码
pip install flask-migrate
复制代码

三、配置

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager

pymysql.install_as_MySQLdb()
app = Flask(__name__)

# 通过脚本管理flask程序
manager = Manager(app)

# 设置连接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1:3306/db_flask'

# 设置每次请求结束后会自动提交数据库中的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

# 数据库和模型类同步修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

# 查询时会显示原始 SQL 语句
app.config['SQLALCHEMY_ECHO'] = True

db = SQLAlchemy(app)

# 创建数据库迁移对象
Migrate(app, db)

# 向脚步管理添加数据库迁移命令 db指命令的别名
manager.add_command('db', MigrateCommand)


# 类型
class Type(db.Model):
    # 表名
    __tablename__ = 'tbl_types'

    # 数据库真正存在的字段
    id = db.Column(db.Integer, primary_key=True)  # 主键
    name = db.Column(db.String(32), unique=True)  # 名字

    # 数据库中不存在的字段,只是为了查找和反向查找。
    # backref:在关系的另一模型中添加反向引用
    heros = db.relationship("Hero", backref='type')

    def __repr__(self):
        return self.name


# 英雄
class Hero(db.Model):
    # 表名
    __tablename__ = 'tbl_heros'
    # 数据库真正存在的字段
    id = db.Column(db.Integer, primary_key=True)  # 主键
    name = db.Column(db.String(64), unique=True)  # 名字
    gender = db.Column(db.String(64))  # 性别

    # 外键 一个射手对应很多英雄
    type_id = db.Column(db.Integer, db.ForeignKey("tbl_types.id"))

    def __repr__(self):
        return self.name


if __name__ == '__main__':
    # 0.0.0.0代表任何能代表这台机器的地址都可以访问
    # app.run(host='0.0.0.0', port=5000)  # 运行程序
    manager.run()

复制代码

四、添加字段

首先我们通过命令创建出migrations文件夹,后面所有的迁移文件都会放在这个文件夹里面

python flask_migrate_db.py db init
复制代码

如图所示:

Flask框架从入门到精通之模型迁移操作(十六)
  • 生成迁移文件

下面这条命令跟我们Django里面的makemigrations一样,是生成迁移文件的作用。因为我们的模型类并没有添加或删除字段,所有第一次会出现没有改变的提示。 -m:给迁移文件加上注释

python flask_migrate_db.py db migrate -m 'first create'
复制代码

提示:

INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.env] No changes in schema detected.
复制代码
  • 添加新字段 我们在英雄里面添加一个年龄字段,再迁移一下:
age = db.Column(db.Integer)  # 年龄
复制代码

迁移

python flask_migrate_db.py db migrate -m 'add age' 
复制代码

迁移文件会生成到migrations文件夹中如图:

Flask框架从入门到精通之模型迁移操作(十六)

生成迁移文件,这个时候数据库并没有改变,我们还要用upgrade命令同步到数据库中:

python flask_migrate_db.py db upgrade
复制代码

我们在本地数据库查看一下表结构:

Flask框架从入门到精通之模型迁移操作(十六)

age字段已经添加到数据库当中了。

五、回退

回退数据库时,需要指定回退版本号,由于版本号是随机字符串,为避免出错,建议先使用python flask_migrate_db.py db history命令查看历史版本的具体版本号,然后复制具体版本号执行回退。

Flask框架从入门到精通之模型迁移操作(十六)

里面base指的是原始版本。例如我们发现我们刚才添加的字段并没有什么作用,我们就可以回退到原始版本。

python flask_migrate_db.py db downgrade base
复制代码

我们在本地数据库查看一下表结构:

Flask框架从入门到精通之模型迁移操作(十六)

后面如果有很多版本,直接指定版本号就可以。例如:

python flask_migrate_db.py db downgrade 4cee71e47df3
复制代码

在Flask中有了对象模型类迁移的扩展,维护起来表结构,方便了很多。

欢迎关注我的公众号:

Flask框架从入门到精通之模型迁移操作(十六)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机图形学原理及实践:C语言描述(原书第2版) (平装)

计算机图形学原理及实践:C语言描述(原书第2版) (平装)

福利 / 唐泽圣 / 机械工业出版社 / 2004-3 / 95.0

《计算机图形学原理及实践:C语言描述(原书第2版)》:这是计算机图形学领域的一部经典之作,作者Fley、va Dam等是国际图形学界的著名学者、学术带头人,而且《计算机图形学原理及实践:C语言描述(原书第2版)》英文版自出版以来,一直是各国大学计算机图形学课程的主要教科书。来自清华大学、北京大学、中国科学院计算技术研究所、中国科学院软件研究所的多位图形学领域的专家和精英花费了大量的时间和精力进行翻......一起来看看 《计算机图形学原理及实践:C语言描述(原书第2版) (平装)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具