zoukankan      html  css  js  c++  java
  • Flask web开发之路十

    首先介绍循环引用的问题:

    当一个模块需要引用另一个模块的类,而另一个模块又需要引用这个模块的类时,就出现了循环引用,而没法导入类,这时候可以切断其中一条引用路径,增加一个模块

    项目结构:

    models_sep.py代码:

    from flask import Flask
    from models import Article
    from exts import db
    import config
    
    app = Flask(__name__)
    app.config.from_object(config)
    db.init_app(app)
    
    #db.create_all()
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    models.py代码:

    from exts import db
    
    class Article(db.Model):
        __tablename = 'article'
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        title = db.Column(db.String(100),nullable=False)

    exts.py代码:

    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()

    ### 分开`models`以及解决循环引用:
    1. 分开models的目的:为了让代码更加方便的管理。
    2. 如何解决循环引用:把`db`放在一个单独的文件中,切断循环引用的线条就可以了。

    然后,讲一下模型初始化init,模型迁移migrate和模型upgrade

    要解决的问题:假如第一次创建好数据模型后,之后要更改模型结构,增删改查等等,粗暴的方式是删掉整张表,然后再新建,但是这样非常不利于维护,因此有需要用到Flask_Migrate

    项目结构:

    migrate_demo.py代码:

    from flask import Flask
    from exts import db
    import config
    from models import Article
    
    app = Flask(__name__)
    app.config.from_object(config)
    db.init_app(app)
    
    
    # 新建一个article模型,采用models分开的方式
    # flask-scripts
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    manage.py文件代码:

    from flask_script import Manager
    from migrate_demo import app
    from flask_migrate import Migrate,MigrateCommand
    from exts import db
    from models import Article
    
    # init
    # migrate
    # upgrade
    #模型 -> 迁移文件 -> 表
    
    manager = Manager(app)
    
    #1.要使用flask_migrate,必须要绑定app和db
    migrate = Migrate(app,db)
    
    #2.把MigrateCommand命令添加到manager中
    manager.add_command('db',MigrateCommand)
    
    if __name__ == '__main__':
        manager.run()

    exts.py文件代码;

    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()

    models.py文件代码:

    from exts import db
    
    class Article(db.Model):
        __tablename__ = 'article'
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        title = db.Column(db.String(100),nullable=False)
        content = db.Column(db.Text,nullable=False)
        tags = db.Column(db.String(100),nullable=False)
        #authors = db.Column(db.String(20),nullable=False)

    在终端的项目文件路径中依次运行:

    python manage.py db init 

    python manage.py db migrate

    python manage.py db upgrade

    发现在数据库中已经创建好了article表

    然后在models.py文件里给数据模型新增一个数据字段authors,接着在终端里运行python manage.py db migrate和python manage.py db upgrade

    可以用发现数据库表里面已经对article做了修改:

    ### Flask-Migrate的介绍与安装:
    1. 介绍:因为采用`db.create_all`在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,然后重新运行`db.craete_all`才会重新映射,这样不符合我们的需求。因此flask-migrate就是为了解决这个问题,她可以在每次修改模型后,可以将修改的东西映射到数据库中。
    2. 首先进入到你的虚拟环境中,然后使用`pip install flask-migrate`进行安装就可以了。
    3. 使用`flask_migrate`必须借助`flask_scripts`,这个包的`MigrateCommand`中包含了所有和数据库相关的命令。
    4. `flask_migrate`相关的命令:
    * `python manage.py db init`:初始化一个迁移脚本的环境,只需要执行一次。
    * `python manage.py db migrate`:将模型生成迁移文件,只要模型更改了,就需要执行一遍这个命令。
    * `python manage.py db upgrade`:将迁移文件真正的映射到数据库中。每次运行了`migrate`命令后,就记得要运行这个命令。
    5. 注意点:需要将你想要映射到数据库中的模型,都要导入到`manage.py`文件中,如果没有导入进去,就不会映射到数据库中。
    6. `manage.py`的相关代码:
    ```
    from flask_script import Manager
    from migrate_demo import app
    from flask_migrate import Migrate,MigrateCommand
    from exts import db
    from models import Article

    # init
    # migrate
    # upgrade
    # 模型 -> 迁移文件 -> 表

    manager = Manager(app)

    # 1. 要使用flask_migrate,必须绑定app和db
    migrate = Migrate(app,db)

    # 2. 把MigrateCommand命令添加到manager中
    manager.add_command('db',MigrateCommand)

    if __name__ == '__main__':
    manager.run()
    ```

    人生苦短,何不用python
  • 相关阅读:
    多线程(5)async&await
    多线程(4)Task
    多线程(3)ThreadPool
    多线程(2)Thread
    多线程(1)认识多线程
    泛型
    反射(4)反射性能问题:直接调用vs反射调用
    反射(3)反射应用:一个插件项目
    反射(2)使用反射
    反射(1)认识反射
  • 原文地址:https://www.cnblogs.com/yqpy/p/8659092.html
Copyright © 2011-2022 走看看