models分类解决循环引用
其实学到这里发现很多机制和Django都很类似,可能原理性都差不多,只是实现的机制和功能上有不同点,Django上也是会单独分离出一个models.py文件单独作为对模型的处理,这里也是为了避免主文件里代码冗余影响可读性。
比如之前的代码中,我们将对Article模型的建立模块单独到models.py文件里处理,
- 但是这里就又出现了另外一个问题,处理模型板块需要db对象,如果这里引入主文件里面的db,主文件又引入models.py里面的Article,这里就出现了循环引用,类似while True的死循环
- 为了解决这个问题,没错,就是再独立一个板块出来获取db对象,我们用exts.py表示(extension)
exts.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
models文件直接从exts里面获取db
models.py
from exts import db
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(10), nullable=False)
主文件
- 在创建SQLAlchemy对象时往往需要传入app对象,但是如果此时不方便传入,那么Flask也提供了相应的方法init_app()以对它进行初始化,此时在主文件里调用执行初始化也可以
- 同学们在这里直接执行db.create_all()应该是会报错的,抛出应用未注册的错误,这涉及到应用里面的上下文知识,当你访问服务器时,它会自动把当前的app注册到服务器的栈上,但是如果你没有事先访问服务器,那么就需要手动添加,这里的app_context()方法即实现了此功能
app.py
from flask import Flask
from models import Article#一定记得要导入模型,不然创建时不知道在哪里寻找模型
from exts import db
import config
import pymysql
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
with app.app_context():
db.create_all()
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
app.run(debug=True)
config里面设置数据库连接的配置
config.py
SQLALCHEMY_DATABASE_URI ='mysql+pymysql://root:299521@127.0.0.1:3306/demo1'
SQLALCHEMY_TRACK_MODIFICATIONS = False
image.png
image.png
网友评论