准备工作
1. Manager
# 1. 安装flask-script
    pip install flask-script
# 使用里面的Manager进行命令得到管理和使用-app.py
    'from flask_script import Manager'
    from apps import create_app
    app = create_app()
    # pip install flask-script==2.0.3
    'manager = Manager(app=app)'  # 相当于把app包装一下
    if __name__ == '__main__':
        manager.run()
    # 使用命令在终端
      pip app.py runserver
      pip app.py runserver -h 0.0.0.0 -p 8080
# 自定义添加命令-app.py:
    @manager.command
    def init():
        print("初始化")
# 执行: python app.py init
2. 数据库
# 1. 安装第三方库文件
  pip install pymysql      # 保持持久化
  pip install flask-sqlalchemy==3.0.3  # 实现ORM映射
  pip install flask-migrate==2.7.0   # 发布命令工具
# 2. settings中配置数据库链接
  # 配置文件
    class Config:  # 公共配置
        DEBUG = True
        # mysql + pymysql ://user:password@hostip:port/databasename
        SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@127.0.0.1:3306/flaskday05'
        SQLALCHEMY_TRACK_MODIFICATIONS = False # 忽略警告
        SQLALCHEMY_ECHO = True  # 开发调试
    class DevelopmentConfig(Config):  # 开发环境
        ENV = "development"
    class ProductionConfig(Config):  # 生产环境
        ENV = 'production'
        DEBUG = False
# 3. 创建ext包 ,编辑__init__.py
      # 创建映射对象
      from flask_sqlalchemy import SQLAlchemy
      db = SQLAlchemy()
# 4. 编辑apps/__init__.py,将db对象与app进行关联
    from flask import Flask
    import settings
    from apps.user.view import user_bp
    from exts import db
    def create_app():
        app = Flask(__name__, template_folder="../templates", static_folder="../static")
        app.config.from_object(settings.DevelopmentConfig)
        'db.init_app(app)'  # 将db对象与app进行关联
        # 注册蓝图
        app.register_blueprint(user_bp)
        return app
# 5. 编辑app.py 创建数据库的映射关系
    from flask_migrate import Migrate, MigrateCommand
    from flask_script import Manager
    from apps import create_app
    from exts import db
    app = create_app()
    # pip install flask-script==2.0.3
    manager = Manager(app=app)  # 相当于把app包装一下
    # 命令工具
    'migrate = Migrate(app=app, db=db)'    # 影响数据库的映射关系
    'manager.add_command('db', MigrateCommand)'  # 将命令交给manaher处理
    if __name__ == '__main__':
        manager.run()
  
# 6. 在apps/user 创建models.py文件,创建模型类
    # ORM 类 -->表
    # 类对象 --> 表中的一条数据
    from datetime import datetime
    from exts import db
    class User(db.Model):
        # db.Column(类型,约束) 映射表中的列
        # 数值类型,主键,自增
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        # 字符串类型, 不允许为空
        username = db.Column(db.String(15), nullable=False)
        password = db.Column(db.String(12), nullable=False)
        # 字符串类型,唯一约束
        phone = db.Column(db.String(11), unique=True)
        # 日期时间,默认值:当前时间
        email = db.Column(db.String(20))
        radtetime = db.Column(db.DateTime, default=datetime.now)
        def __str__(self):
            return self.username
# 7. 使用命令:
    a. 在app.py中导入模型: from apps.user.models import User #置灰不用,但需要导入
    b. 在终端使用命令: db
        python app.py db init       # 产生一个文件夹 migrations,只需执行一次
        python app.py db migrate    # 迁移: 自动生成一个版本文件,在migrations/version生成一个.py文件
        python app.py db upgrade    # 同步: 生成数据库表
        python app.py db downgrade  # 降级: 数据库版本回退