• flask-migrate


    Flask & Migrate

    Intro:

    我们有了sqlalchemy后,依然不能像django一样愉快的实现python manage.py makemigration/ migrate。对于数据库表结构的改变,sqlalchemy的限制是比较严格的。其实sqlalchemy的作者为我们提供了解决方案alembic(逻辑类似于git),而flask-migrate通过flask-script模块对alembic进行了进一步的封装。为了实现migrate,自然需要先了解script和alembic两个模块

    Ⅰ flask-script

      Flask-Script主要实现的功能是通过命令行的形式来操作Flask。例如python manage.py func1 -u args

      通常flask-script的manage.py文件为flask文件的入口

    from flask_script import Manager
    from flaskapp import app,DatabaseTable,db
    
    manager = Manager(app)
    
    
    # 通过command装饰器实现无参数命令,python manage.py greet
    @manager.command   
    def greet():
        print('你好')
    
    
    # 通过option装饰器实现带参数命令python manage.py -u lala -e la@l.com
    # -u代表第一个参数的简称,--username是全称, dest 是参数传递的目标形参
    @manager.option("-u","--username",dest="username")
    @manager.option("-e","--email",dest="email")
    def add_user(username,email):
        user = DatabaseTable(username=username,email=email)
        db.session.add(user)
        db.session.commit()
    # manage.py
    from flask_script import Manager
    from db_script import db_manager
    
    manager = Manager(app)
    manager.add_command("db",db_manager)  # 注册子命令,db为自命令的名称
    
    
    
    # db_script.py
    from flask_script import Manager
    
    db_manager = Manager()
    
    @db_manager.command
    def init():
        print('迁移仓库创建完毕!')
    
    @db_manager.command
    def revision():
        print('迁移脚本生成成功!')
    
    @db_manager.command
    def upgrade():
        print('脚本映射到数据库成功!')
    
    
    # 调用python manage.py db init
    子命令

    Ⅱ alembic

      用来更改数据库结构

      具体迁移步骤:

    1. 定义好自己的模型
    2. 使用alembic创建一个仓库:`alembic init [仓库的名字,推荐使用alembic]`。 模块会创建指定名字的文件夹
    3. 修改配置文件:
        * 在`alembic.ini`中,给`sqlalchemy.url`设置数据库的连接方式。这个连接方式跟sqlalchemy的方式一样的。
        * 在`alembic/env.py`中的`target_metadata`设置模型的`Base.metadata`,要导入`models`。可使用相对路径:
            ```python
            import sys,os
            sys.path.append(os.path.dirname(os.path.dirname(__file__)))   # 如果是flask-sqlalchemy用db.Model.metabase
            ```
    4. 将ORM模型生成迁移脚本:`alembic revision --autogenerate -m '想要加的消息'`。  # -m 是消息 。 会根据表结构的更改而自动生成脚本
    5. 将生成的脚本映射到数据库中:`alembic upgrade head`。  这一步才更改数据库,head可以是脚本编码,在脚本文件中能找到脚本编码
    6. 以后如果修改了模型,重复4、5步骤。

    1. init:创建一个alembic仓库。
    2. revision:创建一个新的版本文件。  用这个生成了一个脚本。然后用upgrade改
    3. --autogenerate:自动将当前模型的修改,生成迁移脚本。
    4. -m:本次迁移做了哪些修改,用户可以指定这个参数,方便回顾。
    5. upgrade:将指定版本的迁移文件映射到数据库中,会执行版本文件中的upgrade函数。如果有多个迁移脚本没有被映射到数据库中,那么会执行多个迁移脚本。upgrade加版本号就可以了,head指向最新的版本
    6. [head]:代表最新的迁移脚本的版本号。
    7. downgrade:会执行指定版本的迁移文件中的downgrade函数。
    8. heads:展示head指向的脚本文件版本号。
    9. history:列出所有的迁移版本及其信息。
    10. current:展示当前数据库中的版本号。
    常用命令

    Ⅲ flask-migrate

       flask-migrate对alembic的命令通过flask-script进行了封装

    from flask_script import Manager
    from zhiliao import app
    from exts import db
    from flask_migrate import Migrate,MigrateCommand
    
    manager = Manager(app)
    # 绑定app和db到flask_migrate
    Migrate(app,db)
    
    # 添加Migrate的所有子命令到db子命令下
    manager.add_command("db",MigrateCommand)
    
    if __name__ == '__main__':
        manager.run()
    1. 初始化一个环境:python manage.py db init
    2. 自动检测模型,生成迁移脚本:python manage.py db migrate
    3. 将迁移脚本映射到数据库中:python manage.py db upgrade
    4. 更多命令:python manage.py db --help
    命令

    Ⅳ Example

      结合sqlalchemy简单实例

    from flask import Flask
    import config
    from exts import db
    
    app = Flask(__name__)
    app.config.from_object(config)
    db.init_app(app)
    
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    @app.route("/profile/")
    def profile():
        pass
    
    
    if __name__ == '__main__':
        app.run()
    flaskapp.py
    DB_USERNAME = 'root'
    DB_PASSWORD = 'root'
    DB_HOST = '127.0.0.1'
    DB_PORT = '3306'
    DB_NAME = 'flask_migrate_demo'
    
    DB_URI = 'mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8' % (DB_USERNAME,DB_PASSWORD,DB_HOST,DB_PORT,DB_NAME)
    
    SQLALCHEMY_DATABASE_URI = DB_URI
    config.py
    # 该文件的目的是为了防止model.py和flaskapp的循环引用
    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy()
    exts.py
    from exts import db
    
    class User(db.Model):
        __tablename__ = 'user'
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        username = db.Column(db.String(50),nullable=False)
        age = db.Column(db.Integer)
    models.py
    from flask_script import Manager
    from flaskapp import app
    from exts import db
    from flask_migrate import Migrate,MigrateCommand
    
    from models import User  # 这里一定要导入
    
    manager = Manager(app)
    
    Migrate(app,db)
    
    manager.add_command("db",MigrateCommand)
    
    if __name__ == '__main__':
        manager.run()
    manage.py
  • 相关阅读:
    HDFS面试准备
    大数据learn---准备复试
    spring和springMVC的整合
    jsp前端语言
    my_SpringMVC_learning
    代理类学习
    my-spring-learing(AOP)
    django安装配置及测试
    IOS学习之路五(代码实现UITableView)
    IOS7配置自动布局的约束
  • 原文地址:https://www.cnblogs.com/yxi-liu/p/8574445.html
Copyright © 2020-2023  润新知