网站LOGO
博客 | 棋の小站
页面加载中
12月6日
达尔达尼亚瀑布,博洛尼亚,意大利 ...
网站LOGO 博客 | 棋の小站
记录学习,心得,状态,生活。
菜单
  • 博客 | 棋の小站
    记录学习,心得,状态,生活。
    用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    Flask拓展框架2——Flask-Migrate
    点击复制本页地址
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。
    按住ctrl可打开默认菜单

    Flask拓展框架2——Flask-Migrate

    · 原创 ·
    学学编程 · FlaskPython
    共 2934 字 · 约 2 分钟 · 460

    在拓展框架中我了解到了Flask-SQLAlchemy框架,但是这个框架仅仅能起到创建数据表的操作。一旦数据表已经创建,该数据表的结构就已经确定了。若要改变数据表的结构,只能先使用drop_all()方法先删除数据表,然后在对应的模型类里面新增一个成员属性,再调用create_all()方法重新创建数据表。也就是说Flask-SQLAlchemy框架不支持执行alter语句的功能。因此SQLAlchemy的开发者就开发了另一个工具让它能操作数据表,改变数据表的结构,这个工具就是Alembic,这个工具集成在Flask-Migrate框架中。

    Flask-Migrate的安装

    在venv虚拟环境中使用pip install Flask-Migrate语句就可以安装这个框架。

    Flask-Migrate的使用

    查看帮助

    Flask-Migrate提供了一个命令集,使用db作为命令集名称,可以执行flask db --help来查看Flask-Migrate的基本使用。

    创建迁移环境

    使用Flask-Migrate可以创建迁移环境,需要Migrate类,代码如下:

    python 代码:
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from flask_migrate import Migrate
    
    app = Flask(__name__)
    
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:254456@localhost/db_flask'
    
    db = SQLAlchemy(app)
    migrate = Migrate(app, db)
    
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(80), unique=True, nullable=False)
        email = db.Column(db.String(120), unique=True, nullable=False)
        articles = db.relationship('Articles')
    
        def __repr__(self):
            return '<User %r>' % self.username
    
    
    class Article(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(80), index=True)
        content = db.Column(db.Text)
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    
        def __repr__(self):
            return '<User %r>' % self.username
    
    
    if __name__ == '__main__':
        with app.app_context():
            db.create_all()

    在上述代码中,实例化Migrate类时传入了两个参数,第一个参数时应用程序实例,第二个参数是SQLAlchemy的实例化对象。

    接下来需要使用FLASK_APP变量定义如何载入应用。不同的操作系统操作不同。

    Windows系统:

    bash 代码:
    set FLASK_APP=manage.py
    “FLASK_APP=manage.py中间没有空格,其中manage.py指创建迁移环境的Python文件,且它是会话变量。”

    Mac、Linux系统、其它系统:

    bash 代码:
    export FLASK_APP=manage.py

    准备就绪,开始创建一个迁移环境,执行如下命令:

    bash 代码:
    flask db init

    执行成功后会在项目根目录下创建一个migrations文件夹,其中包含了配置文件和迁移版本文件。

    生成迁移脚本

    创建完迁移环境后执行如下命令,自动生成迁移脚本:

    这里假设我们要增加的字段为gender。
    bash 代码:
    flask db migrate -m "add gender for user table"

    执行后会在migrations/versions/目录下生成一个迁移脚本文件,关键代码如下:

    python 代码:
    def upgrate():
        # ###commands auto generated by Alembic - please adjust!###
        op.add_column('user', sa.column('gender', ga.BOOLEAN(), nullable=True))
        ###end Alembic commands###
    
    def downgrate():
        # ###commands auto generated by Alembic - please adjust!###
        op.drop_column('user', 'gender')
        ###end Alembic commands###

    上述代码中,upgrate()函数就是用于将改动应用到数据库的函数。

    每一次生成迁移脚本都会生成一个新的版本号,方便随时回退。

    更新数据库

    生成迁移脚本后,就可以输入下面的命令执行更新脚本:

    bash 代码:
    flask db upgrad

    执行此语句后数据库就会生成一个alembic_version表,用于记录当前版本号,修改的user表就会新增一个gender字段。

    迁移环境只需要创建一次,也就是说下次不需要再创建迁移环境,只需要执行flask db migrateflask db upgrad命令即可。
    声明:本文由 (博主)原创,依据 CC-BY-NC-SA 4.0 许可协议 授权,转载请注明出处。

    还没有人喜爱这篇文章呢

    发一条! 发一条!
    博客logo 博客 | 棋の小站 记录学习,心得,状态,生活。
    ICP 冀ICP备2023007665号 ICP 冀公网安备 13030202003453号

    🕛

    本站已运行 221 天 14 小时 56 分

    👁️

    今日访问量:362 昨日访问量:2564

    🌳

    建站:Typecho 主题:MyLife
    博客 | 棋の小站. © 2023 ~ 2023.
    网站logo

    博客 | 棋の小站 记录学习,心得,状态,生活。
     
     
     
     
    壁纸