zoukankan      html  css  js  c++  java
  • Flask-Migrate

    Flask-Migrate 插件提供了和 Django 自带的 migrate 类似的功能。

    即 Alembic(Database migration 数据迁移跟踪记录)提供的数据库升级和降级的功能。它所能实现的效果有如 Git 管理项目代码一般。

     


     

    安装 Flask-Migrate

    pip install Flask-Migrate
    

    多数情况下 Flask-Migrate 是会和命令行工具插件 Flask-Script 和数据库插件 flask_sqlalchemy 一起使用的,所有也把 Flask-Script 安装一下:

    pip install Flask-Script 
    

     


     

    实例

    官方文档给出的例子:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from flask_script import Manager
    from flask_migrate import Migrate, MigrateCommand
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
    
    db = SQLAlchemy(app)
    
    # 初始化 migrate
    # 两个参数一个是 Flask 的 app,一个是数据库 db
    migrate = Migrate(app, db)
    
    # 初始化管理器
    manager = Manager(app)
    # 添加 db 命令,并与 MigrateCommand 绑定
    manager.add_command('db', MigrateCommand)
    
    # 构建我们的数据模型
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(128))
    
    if __name__ == '__main__':
        manager.run()
    

    假设上面的代码保存在文件 manage.py 中,我们可以这样执行相关命令:

    $ python manage.py db init
    $ python manage.py db migrate
    $ python manage.py db upgrade
    $ python manage.py db --help
    

    当然,更多情况下我们不会把代码都放到一个文件里面,我们应该建立一个 manage.py 来放置相关代码,详细源码我传到 Github 上面:https://github.com/SingleDiego/flask-migrate

     


     

    查看指令 manager db 的可用选项

    >>> python manage.py db
    usage: Perform database migrations
    
    Perform database migrations
    
    positional arguments:
      {init,revision,migrate,edit,merge,upgrade,downgrade,show,history,heads,branches,current,stamp}
        init                Creates a new migration repository
        revision            Create a new revision file.
        migrate             Alias for 'revision --autogenerate'
        edit                Edit current revision.
        merge               Merge two revisions together. Creates a new migration
                            file
        upgrade             Upgrade to a later version
        downgrade           Revert to a previous version
        show                Show the revision denoted by the given symbol.
        history             List changeset scripts in chronological order.
        heads               Show current available heads in the script directory
        branches            Show current branch points
        current             Display the current revision for each database.
        stamp               'stamp' the revision table with the given revision;
                            don't run any migrations
    
    optional arguments:
      -?, --help            show this help message and exit
    

     


     

    初始化 DB Migrate

    >>> python manage.py db init
    

    执行该命令后会创建一个 migrations 目录,所有的更改记录文件都会被保存在该目录下。

     


     

    开始第一次跟踪

    >>> python manage.py db migrate -m "Initial migration"
    

    该指令会扫描所有的 SQLAlchemy 对象,并将没有记录过的行和列记录成为一个 python 文件并保存到 migrations/versions 路径下。然后给本次扫描结果分配一个版本号。

    例如,我的例子中第一个版本的版本号就是: 6c1971cccc11_initial_migration.py,打开该文件,可以看到该文件记录了数据库的结果,比如这样:

    def upgrade():
        # ### commands auto generated by Alembic - please adjust! ###
        op.create_table('user',
        sa.Column('id', sa.Integer(), nullable=False),
        sa.Column('name', sa.String(length=128), nullable=True),
        sa.PrimaryKeyConstraint('id')
        )
        # ### end Alembic commands ###
    

     


     

    根据记录文件生成数据库

    >>> python manage.py db upgrade
    

    该命令会根据 migrations/versions 路径下的文件来创建或修改数据库,生成的数据库会有一张名为 alembic_version 的表来记录数据库版本号。

     


     

    回滚到某历史版本

    # 获取 History ID
    >>> python manage.py db history
    
    # 回滚到某个 history
    >>> python manage.py db downgrade <history_id>
  • 相关阅读:
    n年的一次聚会
    maven用途、核心概念、用法、常用参数和命令、扩展
    iOS系统架构和Object-C基本数据类型(1)
    Object-C类、方法、构造函数(2)
    iOS 【资源篇】
    iOS播放视频
    蘑菇街 IM 项目 TeamTalk
    Extjs5.0 学习之路【结构篇】
    Hibernate基础(一)
    C# Winform中无焦点状态下获取键盘输入或者USB扫描枪数据
  • 原文地址:https://www.cnblogs.com/vianzhang/p/13158360.html
Copyright © 2011-2022 走看看