错误flask-sqlalchemy NameError:未定义全局名称'joinedload'
Posted
技术标签:
【中文标题】错误flask-sqlalchemy NameError:未定义全局名称\'joinedload\'【英文标题】:Error flask-sqlalchemy NameError: global name 'joinedload' is not defined错误flask-sqlalchemy NameError:未定义全局名称'joinedload' 【发布时间】:2013-05-28 22:00:28 【问题描述】:我正在尝试使用 sqlalchemy 加载策略来加快查询速度。阅读this 后,我意识到我犯了一个错误,即循环遍历模板中的记录。唯一的问题是我收到此错误:
NameError:未定义全局名称“joinedload”。
发生这种情况是因为我正在使用 flask-sqlalchemy 还是我忘记导入某些东西?
模型.py:
inspection_violations = db.Table('inspection_violations',
db.Column('violation_id', db.Integer, db.ForeignKey('violations.violation_number')),
db.Column('inspection_id', db.Integer, db.ForeignKey('inspection.inspection_id')), )
class Inspection(db.Model):
inspection_id = db.Column(db.Integer, primary_key=True)
violations = db.relationship('Violations', secondary=inspection_violations, backref=db.backref('inspection', lazy='dinamic'))
facility_id = db.Column(db.String(100), db.ForeignKey('facilities.branch_name'))
class Violations(db.Model):
violation_number = db.Column(db.Integer, primary_key=True)
details = db.Column(db.Text)
违规蓝图:
@violations_blueprint.route('/violations/<int:violation_number>')
def show_single_violation(violation_number):
violation = Violations.query.options(joinedload('inspection')).get(violation_number)
return render_template('violations/single-violation.html' ,violation=violation)
模板:
% for inspection in violation.inspection %
<p><a href=" url_for('inspection_blueprint.show_inspection', id=inspection.inspection_id) "> inspection.facilities.branch_name </a></p>
% endfor %
为了给我的模型提供一些背景信息,我有一份检查记录。每次检查都有一个或多个违规行为。而且每次违规都有很多检查
【问题讨论】:
【参考方案1】:嗯,错误消息说joinedload
未定义,所以显而易见的解决方案是检查您是否导入了它,如果没有 -
from sqlalchemy.orm import joinedload
【讨论】:
嗨 Bibhas,谢谢。我只是不确定它是否被导入或从哪里导入,因为我使用的是烧瓶扩展。flask-sqlalchemy
在下面使用sqlalchemy
。所以你总是可以从中导入模块。
@Bibhas 虽然你说的是 100% 正确,但 Flask-SQLAlchemy 也会将所有内容导入到db
,所以也许你也可以使用它。
谢谢,我现在知道即使我使用的是扩展程序,它仍然可以以相同的方式导入。 @jadikik94,你是对的,这就是为什么我对从哪里导入感到困惑【参考方案2】:
以我的情况,只是订单问题
class Inspection(db.Model):
class Violations(db.Model):
inspection_violations = () //wrong junction table position
这也不起作用。因为当您使用inspection_violations 时,它尚未定义。也会报告同样的问题
只需更改顺序即可使其正常工作
inspection_violations = () //right junction table position
class Inspection(db.Model):
class Violations(db.Model):
这是正确的做法。
【讨论】:
以上是关于错误flask-sqlalchemy NameError:未定义全局名称'joinedload'的主要内容,如果未能解决你的问题,请参考以下文章
使用 mysql 和烧瓶登录的 Flask-sqlalchemy 损坏管道错误 32
错误flask-sqlalchemy NameError:未定义全局名称'joinedload'
在 Flask-SQLAlchemy 模型上使用函数查询会给出 BaseQuery object is not callable 错误