Flask-Script 和 Flask-Migrate

Flask 学习笔记

一、Flask-Script


1.1、简介

        Flask-Script 的作用是可以通过命令行的形式来操作 Flask。例如通过命令操作一个开发版本的服务器、设置数据库,定时任务等。要使用 Flask-Script。可以通过 pip install flask-script 安装最新版本。



1.2、命令实现代码的方法

	from flask_script import Manager
	
	# 其中 flask_sqlal_demo 是一个py文件(就上一篇写好的), 主要是用到其 app
	from flask_sqlal_demo import app
	
	manager = Manager(app)
	
	
	@manager.command
	def hello():
	    print('hello')
	
	
	if __name__ == '__main__':
	    manager.run()

我们把脚本命令代码放在一个名为 manage.py 文件中(名字随便),然后在终端(cmd)运行 python manage.py hello 命令,就可以看到输出 hello 了。



1.3、option 装饰器

        如果想要在使用命令的时候还传递参数进去,那么使用 @option 装饰器更加的方便。

	# option 装饰器
	# '-n', '--name', 一个缩写一个全称(自定义的)
	# 参数的 3 个变量名要相同, 否则会报错
	
	@manage.option('-n', '--name', dest='name1')
	def hello(name1):
	    print('Hello ', name1)
	
	
	if __name__ == '__main__':
	    manage.run()

终端执行:python manage.py hello --name laowang 或者 python manage.py hello -n laowang ,其中 hello 是方法名。



1.4、添加参数到命令中

  1. option 装饰器:上面也已经介绍过了
	@manager.option('-n', '--name', dest='name', default='xxx')
	@manager.option('-u', '--url', dest='url', default=None) 
	def hello(name, url): 
	  if url is None: 
	     print("hello", name)
	  else: 
	      print("hello", name, "from", url)
  1. command 装饰器:也可以添加参数,但是不能那么的灵活
	@manager.command 
	def hello(name="xxx") 
		print("hello", name)



二、Flask-Migrate


2.1、简介

        在实际的开发环境中,经常会发生数据库修改的行为。一般我们修改数据库不会直接手动的去修改,而是去修改 ORM 对应的模型,然后再把模型映射到数据库中。因为手动修改数据库的信息会造成数据库于 ORM 模型的不匹配。

        这时候如果有一个工具能专门做这种事情,就显得非常有用了,而 flask-migrate 就是做这个事情的。flask-migrate 是基于 Alembic 进行的一个封装,并集成到 Flask 中,而所有的迁移操作其实都是 Alembic 做的,他能跟踪模型的变化,并将变化映射到数据库中。

        使用 pip install flask-migrate 进行安装。



2.2、使用

要让 Flask-Migrate 能够管理 app 中的数据库,需要使用 Migrate(app,db) 来绑定 app 和数据库。

  1. 配置文件 config.py
	# MySQL 的配置项
	
	HOSTNAME = '127.0.0.1'
	DATABASE = 'demo0427'
	PORT = 3306
	USERNAME = 'root'
	PASSWORD = 'root'
	
	DB_URL = 'mysql+mysqlconnector://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
	
	SQLALCHEMY_DATABASE_URI = DB_URL
	SQLALCHEMY_TRACK_MODIFICATIONS = False

  1. 定义 db 在 exts.py 文件中
	# 为防止 models.py 与 flask_app.py 文件造成相互引用, 所以在这里定义 db
	# models.py 引用 flask_app.py 的 db
	# flask_app.py 引用 models.py 的 User
	
	from flask_sqlalchemy import SQLAlchemy
	
	
	# 这里没有导入 app, 否则又会造成相互引用
	db = SQLAlchemy()

  1. 定义模型文件 models.py
	# 这里也要使用 db
	from exts import db
	
	
	class User(db.Model):
	    __tablename__ = 'pro_users'
	
	    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
	    name = db.Column(db.String(70))
	    email = db.Column(db.String(50))
	    password = db.Column(db.String(50))
	    age = db.Column(db.Integer)

  1. 定义 app 文件 flask_app.py
	from flask import Flask
	import config
	from exts import db
	
	app = Flask(__name__)
	
	app.config.from_object(config)
	
	# 向 config 的 db 传入数据
	db.init_app(app)
	
	
	if __name__ == '__main__':
	    app.run(debug=True)

  1. 执行文件 manage.py

            这个文件用来存放映射数据库的命令,MigrateCommandflask-migrate 集成的一个命令,因此想要添加到脚本命令中,需要采用 manager.add_command('db',MigrateCommand) 的方式,以后运行 python manage.py db xxx 的命令,其实就是执行 MigrateCommand
	# 通过这个文件 去映射数据库
	from flask_script import Manager
	from flask_migrate import Migrate, MigrateCommand
	from exts import db
	from flask_app import app
	
	manage = Manager(app)
	
	Migrate(app, db)
	
	manage.add_command("db", MigrateCommand)
	
	
	if __name__ == '__main__':
	    manage.run()



2.3、代码执行

  1. 先既然虚拟环境,并进入项目文件夹
	(flask_project-CuO58BhI) $ cd xxx
  1. 初始化一个迁移文件夹
	(flask_project-CuO58BhI) $ python manage.py db init
  1. 然后把当前的模型添加到迁移文件中
	(flask_project-CuO58BhI) $ python manage.py db migrate
  1. 最后再把迁移文件中对应的数据库操作,真正的映射到数据库中
	(flask_project-CuO58BhI) $ python manage.py db upgrade

你可能感兴趣的:(Flask)