zoukankan      html  css  js  c++  java
  • Flask组件:flask-sqlalchemy & flask-script & flask-migrate

    flask-sqlalchemy组件

    项目目录结构:

    flask目录  # 项目名
    |--- flaskdir
         |--- static  # 静态文件
         |--- templates  # 模板
         |--- models.py  # models 文件
         |--- __init__.py  # 创建 app 对象
         |--- views  # 视图
              |--- account.py
              |--- user.py
    |--- manage.py  # 入口程序
    |--- settings.py  # 配置文件
    |--- create_table.py  # 在数据库中创建表的脚本

    manage.py

    from flaskdir import create_app
    
    app = create_app()
    
    if __name__ == "__main__":
        app.run()

    settings.py

    from redis import Redis
    
    class BaseConfig(object):
        # SESSION_TYPE = "redis"
        # SESSION_REDIS = Redis(host="127.0.0.1",port=6379)
    
        # ##### SQLAlchemy 相关配置 #####
        SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:tj037778@127.0.0.1:3306/dbtest?charset=utf8"  # 连接 数据库
        SQLALCHEMY_POOL_SIZE = 10  # 连接池大小
        SQLALCHEMY_MAX_OVERFLOW = 5  # 连接池 最大溢出
    
        SQLALCHEMY_TRACK_MODIFICATIONS = False
    
        pass
    
    class ProConfig(BaseConfig):
        pass

    create_table.py

    # 在数据库中创建表的脚本
    
    from flaskdir import db,create_app  # 导入 db
    from flaskdir.views import *     # 一定导入 models ,否则找不到表 创建不出来
    app
    = create_app() app_ctx = app.app_context() # 导入 Flask 的 app 上下文 with app_ctx: # __enter__ 方法:通过 LocalStack 放入 Local 中 db.create_all() # 在 with app_ctx 中,执行 db.create_all();调用 LocalStack 获取 Local 中的 app,再去 app 中获取配置
    db.drop_all()

    离线脚本:

    # db就我们在__init__文件中实例化的对象,它包含了create_all(创建表)和drop_all(删除表)的命令,但是由于在使用db时我们需要用到app中关于数据库的配置(从上下文中取),但是这时项目没有运行,没有请求,在local类中没有app的内容,所以我们使用 with 方法,利用上下文管理,将需要的内容添加到loacl对象中

    flaskdir/__init__.py

    from flask import Flask
    from flask_session import Session
    from flask_sqlalchemy import SQLAlchemy  # 从 flask-sqlalchemy 引入 SQLAlchemy
    
    # flask-sqlalchemy 的使用方法:
    # 第一步: 导入并实例化 SQLAlchemy
    db = SQLAlchemy()  # db 这个对象中含有 SQLAlchemy 需要的所有东西,唯独少 数据库连接
    # 注意: SQLAlchemy 的实例化必须要在 蓝图的上面
    
    
    from .views.account import ac
    from .views.user import usr
    from .models import *  # 也要导入 models 中的类
    
    
    def create_app():
        app = Flask(__name__)
        app.config.from_object("settings.ProConfig")
    
        app.register_blueprint(ac)
        app.register_blueprint(usr)
    
        # Flask-session:第一步要实例化 Session;第二步要加配置
        # Session(app)
    
        # 第三步:注册:app 中含有所有的配置文件,所以这一步是去 配置文件中读取 数据库连接
        db.init_app(app)
    
        return app

    flaskdir/models.py

    from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
    from flaskdir import db
    
    # 第二步:让 Users 继承 db.Model;db.Model 就是 SQLAlchemy 中的 Base
    class Users(db.Model):
        __tablename__ = 'users'
    
        id = Column(Integer, primary_key=True)
        name = Column(String(32), index=True, nullable=False)
        # email = Column(String(32), unique=True)
        # ctime = Column(DateTime, default=datetime.datetime.now)
        # extra = Column(Text, nullable=True)

    flaskdir/views/user.py

    from flask import Blueprint
    from flaskdir.models import *  # 导入 model 类
    from flaskdir import db
    
    usr = Blueprint("sur",__name__)
    
    @usr.route("/index")
    def login():
        # 使用flask-sqlalchemy 在数据库 users 表中插入一条数据
        """
        db.session.add(Users(name="neo"))  # db,session 会为每个线程在 数据库连接池 中获取一个连接;基于 scoped_session 实现的
        db.session.commit()  # 提交
        db.session.remove()  # 把连接归还给连接池
        """
        # 使用 flask-sqlalchemy 从数据库 users 表中获取数据
        ret = db.session.query(Users).all()
        print(ret)
        db.session.remove()
    
        return "index"

    flaskdir/views/account.py 略

    flask-sqlalchemy用法归纳:

    a. 下载安装
        pip3 install flask-sqlalchemy
        
    b. chun.__init__.py 
        导入并实例化SQLAlchemy
        from flask_sqlalchemy import SQLAlchemy
        db = SQLAlchemy()
        
        注意事项:
             - 必须在导入蓝图之前
             - 必须导入models.py 
    
    c. 初始化
        db.init_app(app)
        
    d. 在配置文件中写入配置
        # ##### SQLALchemy配置文件 #####
        SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/s9day122?charset=utf8"
        SQLALCHEMY_POOL_SIZE = 10
        SQLALCHEMY_MAX_OVERFLOW = 5
    
    e. 创建models.py中的类(对应数据库表)
        flaskdir/models.py 
            from sqlalchemy.ext.declarative import declarative_base
            from sqlalchemy import Column
            from sqlalchemy import Integer,String,Text,Date,DateTime
            from sqlalchemy import create_engine
            from chun import db
    
    
            class Users(db.Model):
                __tablename__ = 'users'
    
                id = Column(Integer, primary_key=True)
                name = Column(String(32), index=True, nullable=False)
                depart_id = Column(Integer)
    
    f. 生成表(使用app上下文)
        from flaskdir import db,create_app
    
        app = create_app()
        app_ctx = app.app_context() # app_ctx = app/g
        with app_ctx: # __enter__,通过LocalStack放入Local中
            db.create_all() # 调用LocalStack放入Local中获取app,再去app中获取配置
    
            
    g. 基于ORM对数据库进行操作。
        from flask import Blueprint
        from flaskdir import db
        from flaskdir import models
        us = Blueprint('us',__name__)
    
    
        @us.route('/index')
        def index():
            # 使用SQLAlchemy在数据库中插入一条数据
            # db.session.add(models.Users(name='高件套',depart_id=1))
            # db.session.commit()
            # db.session.remove()
            result = db.session.query(models.Users).all()
            print(result)
            db.session.remove()
    
            return 'Index'

    补充: with obj 的用法 

    class Foo:
        def __init__(self):
            pass
    
        def __enter__(self):
            print("进入with obj")
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            print("退出with obj")
    
    obj = Foo()
    
    with obj:  # with 对象 会自动触发类的 __enter__ 方法
        print("在with obj 中")
    """
    with 对象: 时,刚进入 缩进时会自动触发 __enter__ 方法
    缩进执行完后,会自动触发 __exit__ 方法
    """
    
    # 打印结果:
    # 进入with obj
    # 在with obj 中
    # 退出with obj

    flask-script组件:

    安装:

    pip install flask-script

    还是以上面的代码为例:

    manage.py

    from flaskdir import create_app
    from flask_script import Manager  # 从 flask-script 引入 Manager
    
    app = create_app()
    manager = Manager(app)  # 利用 app 进行 Manager 实例化
    
    
    # flask-script 用途一:按照位置传参
    @manager.command
    def custom(arg):
        """
        自定义命令;有个这个,以后不仅可以 runserver,还可以 run 这个命令(函数)
        执行 如: python manage.py custom 123
        """
        print(arg)
        """
        用途如:创建表时不用再写 create_all()、create_table.py 这样的离线脚本,而可以直接放到 这个命令里面
        """
    
    # flask-script 用途二:按照关键字传参
    @manager.option("-n", "--name", dest="name")  # -n 代表 --name,表示 要传入函数参数的 "name"
    @manager.option("-u", "--url", dest="url")  # -u 代表 --url,表示 要传入函数参数的 "url"
    def cmd(name, url):
        """
        自定义命令:
        执行如:python manage.py cmd -n neo -u http://www.baidu.com
        """
        print(name, url)
    
    
    if __name__ == "__main__":
        # app.run()
        manager.run()  # 启动程序改为 manager.run()
    
    """
    flask-script runserver 启动程序:
    在命令行输入: python manage.py runserver 
    并且也可以指定 IP 和 端口,如: python manage.py runserver -h 127.0.0.1 -p 8001
    """

    flask-script用途小结:

    1. 多了 runserver 的命令:
        from flaskdir import create_app
        from flask_script import Manager  # 从 flask-script 引入 Manager
    
        app = create_app()
        manager = Manager(app)  # 利用 app 进行 Manager 实例化
        
        if __name__ == "__main__":
            # app.run()
            manager.run()  # 启动程序改为 manager.run()
    
        
    2. 按照位置传参的命令:
        from flaskdir import create_app
        from flask_script import Manager  # 从 flask-script 引入 Manager
    
        app = create_app()
        manager = Manager(app)  # 利用 app 进行 Manager 实例化
    
    
        # flask-script 用途一:按照位置传参
        @manager.command
        def custom(arg):
            """
            自定义命令;有个这个,以后不仅可以 runserver,还可以 run 这个命令(函数)
            执行 如: python manage.py custom 123
            """
            print(arg)
            """
            用途如:创建表时不用再写 create_all()、create_table.py 这样的离线脚本,而可以直接放到 这个命令里面
            """
            
        if __name__ == "__main__":
            # app.run()
            manager.run()  # 启动程序改为 manager.run()
    
    3. 按照关键字传参人命令:
        from flaskdir import create_app
        from flask_script import Manager  # 从 flask-script 引入 Manager
    
        app = create_app()
        manager = Manager(app)  # 利用 app 进行 Manager 实例化
        
        # flask-script 用途二:按照关键字传参
        @manager.option("-n", "--name", dest="name")  # -n 代表 --name,表示 要传入函数参数的 "name"
        @manager.option("-u", "--url", dest="url")  # -u 代表 --url,表示 要传入函数参数的 "url"
        def cmd(name, url):
            """
            自定义命令:
            执行如:python manage.py cmd -n neo -u http://www.baidu.com
            """
            print(name, url)
    
        if __name__ == "__main__":
            # app.run()
            manager.run()  # 启动程序改为 manager.run()

    flask-migrate 组件:

    安装:

    pip install flask-migrate

    flask-migrate 用于 数据库迁移,该组件依赖于 flask-script 组件

    以上面代码为例:

    from flaskdir import create_app,db
    from flask_script import Manager  # 从 flask-script 引入 Manager
    from flask_migrate import Migrate,MigrateCommand  # 导入 Migrate 和 MigrateCommand
    
    app = create_app()
    manager = Manager(app)  # 利用 app 进行 Manager 实例化
    Migrate(app,db)  # 利用 app 和 db 进行 Migrate 的实例化;db 中有数据库的相关操作
    """
    数据库迁移命令:
        python manage.py db init  # 初始化;仅第一次时需要执行该命令
        python manage.py db migrate  # 相当于 Django 的 makemigrations
        python manage.py db upgrade  # 相当于 Django 的 migrate
    """
    manager.add_command("db",MigrateCommand) # 定义了一个 "db" 的命令; flask-migrate 依赖于 flask-script
    
    
    if __name__ == "__main__":
        # app.run()
        manager.run()  # 启动程序改为 manager.run()

    pipreqs 工具:

    pipreqs 用于 找到项目中使用的所有组件和版本

    安装:

    pip install pipreqs

    用法:

    # 生成 requirements.txt 文件
    pipreqs ./ --encoding=utf-8  # 会自动找到 当前目录下 所有文件所依赖的所有的组件和库,并生成一个 requirements.txt 的文件
    
    # 下载所有依赖
    pip install -r requirements.txt

    虚拟环境:

    # 安装:
    pip install virtualenv
    
    # 命令行创建虚拟环境:
    virtualenv env1 --no-site-packages  # 创建虚拟环境;--no-site-packages 表示 该虚拟环境中不会安装 python site-packages 目录下的组件和库
    
    # 进入虚拟环境:
    cd Scripts
    activate
    
    # 退出虚拟环境:
    deactivate  # 也是在 Scripts 目录下
  • 相关阅读:
    iOS 动画总结UIView动画
    iPhone 本地通知
    NSNotification学习笔记
    [重构]把程序写得更简洁,更好维护
    使用asp:Timer控件为站点创建一个实时时钟
    为用户控件(UserControl)写属性
    Gridview前面10行数据显示背景色
    MS SQL获取最大值或最小值日期的函数
    How to modify Inventory Aging Report form days field default value
    DropDownlist的DataTextField显示多列数据
  • 原文地址:https://www.cnblogs.com/neozheng/p/10317683.html
Copyright © 2011-2022 走看看