washing 2020-06-16
一、flask-script用法
flask官方提供了一个扩展组件flask-script
可以实现在shell
下操作我们的Flask
项目。
安装flask-script
pip install flask-script
1.flask-script简单实现
server.py
from flask import Flask app = Flask(__name__) @app.route(‘/‘) def hello_world(): return ‘Hello World!‘ if __name__ == ‘__main__‘: app.run()
manage.py
from flask_script import Manager from server import app manager = Manager(app) @manager.command def hello(): print(‘hello world‘) if __name__ == ‘__main__‘: manager.run()
解读:manage.py
1.从flask_script模块中导入flask_script的核心类Manager
from flask_script import Manager
2.从server.py模块中把app对象导入
from server import app
3.从Manager()类传入app对象实例化出manager对象,manager对象用于后面所有添加命令
manager = Manager(app)
4.利用@manager.command
装饰器添加以被装饰函数的名字命名的一条命令
与被装饰函数的映射
@manager.command # 相当于添加了一条hello命令,可以调用到hello函数 def hello(): print(‘hello world‘)
5.manager调用run方法之前定义的命令才会生效
if __name__ == ‘__main__‘: manager.run()
在shell中切入到该manage.py的目录中,并且进入虚拟环境。输入命令python manage.py hello
>>python manage.py hello
命令中的hello是@manager.command装饰器装饰的函数名,执行命令后会调用hello函数
2.命令添加方式 (在manage.py文件中写)
第一种(无参命令): 使用manager.command方式添加命令
... @manager.command def demo(): print(‘无参命令‘) ...
执行命令:
>>python manage.py demo
第二种(有参命令): 使用manager.option(‘-简单的命令‘,‘--全写的命令‘,dest=‘传给函数的参数‘)添加命令
... @manager.option("-u","--username",dest="username") @manager.option("-p","--password",dest="password") def login(username, password): print("用户名:{} 密码: {}".format(username,password)) ...
执行命令:
>>python manage.py login -u mark -p 123
第三种(子命令):
比如一个功能对应着很多个命令,这个时候就可以用子命令来实现,可以将这些命令的映射单独放到一个文件方便管理。在这个放着很多命令映射的文件中实例化Manager类出一个新的对象,并在manage.py
文件中通过以下命令来添加子命令
manager.add_command("子命令",Manager对象)
db_script.py文件 (命令映射文件)
from flask_script import Manager db_Manager = Manager() @db_Manager.command def init(): print(‘初始迁移仓库‘) @db_Manager.command def migrate(): print(‘生成迁移脚本‘) @db_Manager.command def upgrade(): print("迁移脚本映射到数据库")
manage.py
from flask_script import Manager from server import app from db_script import db_Manager # 导入子命令文件的Manager类实例化出的对象 manager = Manager(app) manager.add_command("db",db_Manager) # 添加子命令
切入到manage.py所在的目录中,执行以下命令
>> python manage.py db init >> python manage.py db migrate >> python manage.py db upgrade
二、项目重构
将相关数据库配置的信息放在config.py文件当中,然后在主app文件中加载配置的数据库连接信息app.config.from_object(config)
项目目录:
│ app.py │ config.py │ exts.py │ models.py │ ├─static # 文件夹 ├─templates # 文件夹
config.py
HOST = ‘127.0.0.1‘ PORT = ‘3306‘ DATABASE_NAME = ‘01_db‘ USERNAME = ‘root‘ PASSWORD = ‘root‘ DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{databasename}?charset=utf8mb4" .format(username=USERNAME,password=PASSWORD,host=HOST,port=PORT,databasename=DATABASE_NAME) SQLALCHEMY_DATABASE_URI = DB_URI SQLALCHEMY_TRACK_MODIFICATIONS = False
exts.py
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()
models.py
from exts import db class UserInfo(db.Model): __tablename__ = ‘user_info‘ id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(20),nullable=False,server_default=‘‘)
app.py
from flask import Flask from exts import db import config from models import UserInfo app = Flask(__name__) app.config.from_object(config) db.init_app(app) @app.route(‘/‘) def hello_world(): return ‘Hello World!‘ if __name__ == ‘__main__‘: app.run()
三、使用Flask-Migrate迁移数据库
pip install flask-migrate
为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可附加到Flask-Script的manager对象上。在这个例子中,MigrateCommand类使用db命令附加
我们的Flask_Migrate的操作是在shell下完成的,所以要基于Flask-script,Flask-Migrate提供了一个MigrateCommand类,需要附加到Flask-Script的manager对象上,完成命令的创建,并且Flask_Migrate同时体统了Migrate类,需要加载核心对象app和数据库对象db。完成迁移工具的配置。
1.配置Flask_Migrate
manage.py
from flask_script import Manager from flask_migrate import Migrate,MigrateCommand from exts import db from server import app manager = Manager(app) Migrate(app,db) manager.add_command(‘db‘,MigrateCommand)
解读:manage.py
1.首先从flask_migrate中导入Migrate,MigrateCommand
from flask_migrate import Migrate,MigrateCommand
2.Migrate加载app对象和db对象获取数据库的配置信息以及模型表信息
Migrate(app,db)
3.把MigrateCommand附加到manager创建迁移数据库的子命令
manager.add_command(‘db‘,MigrateCommand) #db是迁移命令的对象,名字可以随便取
2.迁移脚本命令
1.创建迁移仓库
>> python manage.py db init
这个命令会创建migrations文件夹,所有迁移文件都放在里面。这里只是创建了迁移仓库,表还没创建
2.创建迁移脚本
>> python manage.py db migrate -m ‘注释信息‘ #注释信息可写可不写
该命令会在数据库创建一张 alembic_version
表,存放着数据库迁移脚本的版本信息,该命令会搜集到需要迁移的模型表信息,写入到脚本中,但是并没有真正的映射到数据库中。
3.更新数据库
>> python manage.py db upgrade