Flask_migrate在网上有很多用例,基本都是demo级别,告诉你怎么用就可以了,但是很多用例都已经过时了,比如还用到MigrateCommand,而你如果一不小心,直接install了最新版的Flask_migrate的话,你在搜索了一番之后会发现,你需要对Flask_migrate降级,才能正常的跑通那些demo,但是降级的同时可能又会引发你其他版本的不兼容,报出一些奇奇怪怪的错误,因此,在我踩了许多坑之后,双手奉上这一最新版本的使用教程,帮助大家少走弯路,一键直达。
官方文档看这里
首先,仔细阅读官方教程,试用官方教程,非常简单的一个用例,你可以轻松的跑通。但是,不好意思,这个用例让我很不舒服的一点,就是他必须在app.py下才能被检测到,正常的执行,这对我们写项目的人来说,是不能忍受的,我不可能把model的代码一股脑全放在app上面,如果这样,让我的代码情何以堪,一点都不优雅。但是可惜的是,官方仅仅提供了最简单的demo,并没有告诉我们,如何才能解耦开来。那么,下面,我将向大家展示如何优雅的解耦。
这是我的项目结构,可以看到,我把model抽了出来。
__init__.py文件代码
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://' + DB_USER + ':' + DB_PASSWORD + '@' + DB_HOST + '/' + DB_DB
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
db = SQLAlchemy(app)
Migrate(app, db)
from model.user import User
user.py 文件代码
from model import db
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(250), unique=True, nullable=False)
username = db.Column(db.String(250), unique=True, nullable=False)
password = db.Column(db.String(250), nullable=False)
login_time = db.Column(db.Integer)
def __init__(self, username, password, email):
self.username = username
self.password = password
self.email = email
def __str__(self):
return "Users(id='%s')" % self.id
app.py文件代码
# This is app.py, this is the main file called.
from model import app
from flask import render_template
@app.route('/')
def index():
return 'Hello World'
if __name__ == '__main__':
app.run(debug=True)
聪明的朋友应该发现我怎么做的了, 是的,我在__init__最后一行,引入了user类,达到了跟官方demo一样的效果,同时在app里面不再创建flask(),直接引入model里面创建的app,这样,本质上还是在app.py里面,但是形式上,已经实现了解耦.