【python-flask学习笔记】3.5 SQLAlchemy-分开models和解决循环引用

 

1、分开models的目的

  • 方便代码管理
  • 解决循环引用

2、循环引用的产生

【python-flask学习笔记】3.1 SQLAlchemy-配置连接与初始化及表映射中的 '实例' 部分的'simiple.py'为例,为了方便代码管理,我们可以把'class Article()' 和 'class User()'两个模型提取出来单独写到一个文件('models.py')里。如下:

'models.py'代码

from simple import db

# 创建映射表
class Article(db.Model):    #模型必须继承db.Model
    #db.Column映射到表中字段,primary_key主键,autoincrement自增,nullable可为空(默认为True)
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key= True, autoincrement = True) 
    title = db.Column(db.String(100),nullable = False)
    content = db.Column(db.Text, nullable = False)

'simple.py'代码

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from models import Article
import config
 
app = Flask(__name__)       #引入配置文件
app.config.from_object(config)
db = SQLAlchemy(app)

#db.create_all() 
 
@app.route('/')
def index():
    return "hello world"
 
if __name__ == '__main__':
    app.run()

然后运行'simple.py'文件,会出现报错,'ImportError: cannot import name 'Article'',不管是路径还是名称都没错呀,为什么会说不能导入'Article'模块呢?这就是由于产生了循环引用的问题。

这是因为主app文件('simple.py')和models文件('models.py')这两个文件相互引用对方的东西,也就导致了死锁,即循环引用。用图解来解释,如下:

2、循环引用的解决

不让models文件从主app文件中引如db,而是从一个第三方文件中引入。

  • (1)新建一个第三方文件('exts.py'
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
  • (2)修改'models.py''db'的引入,即将'models.py'修改为从'exts.py'文件中引入'db',不再是从'simple.py'文件中引入。
from exts import db

# 创建映射表
class Article(db.Model):    #模型必须继承db.Model
    #db.Column映射到表中字段,primary_key主键,autoincrement自增,nullable可为空(默认为True)
    __tablename__ = 'article'
    id = db.Column(db.Integer, primary_key= True, autoincrement = True) 
    title = db.Column(db.String(100),nullable = False)
    content = db.Column(db.Text, nullable = False)
  • (3)修改'simple.py''db'的引入及对db进行初始化 ('db.init_app(app)')。
from flask import Flask
from models import Article
from exts import db
import config
 
app = Flask(__name__)       #引入配置文件
app.config.from_object(config)
db.init_app(app)    

#db.create_all() 
 
@app.route('/')
def index():
    return "hello world"
 
if __name__ == '__main__':
    app.run()

注意:第8行 'db.init_app(app)' ,由于'exts.py'文件中没有对'db = SQLAlchemy()'放app这个参数,这里就要对其进行参数初始化,用init_app(app)

如此一来就解决了循环引用的问题。


以上笔记整理自知了课堂黄勇老师讲解的教学视频《Flask框架入门到实战开发》的第三章第11小节内容,不足之处,望不吝赐教!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值