flask03

一、flask-migrate插件

  • 模型迁移
在Django中,每次添加新的模型类,只需要执行生成迁移文件,执行迁移操作;
    python manager.py makemigrations
    python manager.py migrate

在Flask中,先创建一个路由对应视图函数中db.create_all()方法,每次添加新的模型类,都要调用该路由才能创建;
flask是否可以类似于Django一样?   flask-migrate插件
  • 官方文档
https://flask-migrate.readthedocs.io/en/latest/
  • 安装
pip install Flask-Migrate
  • 配置
# 实例化Migrate对象
migrate = Migrate(app, db)
# 添加db命令
manager.add_command('db', MigrateCommand)
  • flask-migrate + flask-script 使用
$ python manager.py db init         # 创建迁移目录(只需执行一次)
$ python manager.py db migrate      # 生成迁移文件
$ python manager.py db upgrade      # 执行迁移(生成表单)
$ python manager.py db downgrade    # 回退操作
$ python manager.py db --help       # 帮助文档

二、数据库配置

  • 使用sqlite
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////' + os.path.join(BASE_DIR, 'app.db')
  • 使用mysql
# SQLALCHEMY_DATABASE_URI
dialect+driver://username:password@host:port/databasename
dialect     数据库
driver      驱动
username    数据库用户名
password    数据库密码
host        数据库主机
port        数据库端口号
databasename    数据库 库名
  • 连接mysql
- 安装驱动
    pip install pymysql
    
- 创建数据库
    create database xxx charset=utf8;
    
- 配置数据库
    URI = 'mysql+pymysql://root:[email protected]:3306/xxx'
    app.config['SQLALCHEMY_DATABASE_URI'] = URI

三、项目拆分

  • 插件
flask-print
flask-blueprint
flask-session
flask-sqlalchemy
flask-migrate
  • 基本划分
__init__.py # 包
views.py    # 路由、视图函数
models.py   # 模型类
setting.py  # 配置
ext.py      # 扩展
  • settings.py
import os

BASE_DIR = os.path.dirname(os.path.abspath(__file__)

def get_database_uri(DATABASE):
    db = DATABASE.get('DATABASE') or 'mysql'
    driver = DATABASE.get('DRIVER') or 'pymysql'
    user = DATABASE.get('USER') or 'root'
    password = DATABASE.get('PASSWORD') or '1234'
    host = DATABASE.get('HOST') or '127.0.0.1'
    port = DATABASE.get('PORT) or '3306'
    databasename = DATABASE.get('DATABASENAME)
    
    return '{}+{}://{}:{}@{}:{}/{}'.format(db,driver,user,password,host,port,databasename)

# 配置基类
class BaseConfig():
    DEBUG = False
    TESTING = False
    # 秘钥 session
    SECRET_KEY = '123$^^%&^^$DJD'
    # flask-session 持久化
    SESSION_TYPE = 'redis'
    
# 开发环境(默认环境)
class DevelopConfig(BaseConfig):
    DEBUG = True
    # 数据库
    SQLALCHEMY_DATABASE_URI = 'splite:////' + os.path.join(BASE_DIR, 'develop.db')
    
# 测试环境
class TestingConfig(BaseConfig):
    TESTING = True
    # 数据库
    SQLALCHEMY_DATABASE_URI = os.path.join(BASE_DIR, 'testing.db')
    
# 演示环境
class StagingConfig(BaseConfig):
    TESTING = True
    # 数据库
    SQLALCHEMY_DATABASE_URI = os.path.join(BASE_DIR, 'staging.db')
    
# 线上环境
class ProductConfig(BaseConfig):
    # 数据库配置
    DATABASE = {
        'DATABASE':mysql,
        'DRIVER':'pymysql',
        'USER':'root',
        'PASSWORD':'1234',
        'HOST':'127.0.0.1',
        'PORT':'3306',
        'DATABASENAME':'flask03',
    }
    
    # 数据库
    SQLALCHEMY_DATABASE_URI = get_database_uri(DATABASE)
    
config = {
    'develop':DevelopConfig,    # 开发环境
    'testing':TestingConfig,    # 测试环境
    'staging':StagingConfig,    # 演示环境
    'product':ProductConfig,    # 线上环境
    'default':DevelopConfig,    # 默认开发环境
    
}
  • init.py
app.config.from_object(config.get(env_name or 'default')
  • models.py
__tablename__ = '表名'

你可能感兴趣的:(flask03)