首页 > 解决方案 > 为什么 SQLAlchemy 会重新加载joinedloaded 属性

问题描述

我试图阻止 SQLAlchemy 执行 SQL 请求,因为重新加载没有意义,因为我看到它已经加载。

一点上下文:

我有一个FeedsOut如下所示的类:

class FeedsOut(db.Model):
    __tablename__ = 'feeds_out_tb'
    username = db.Column(db.String(SLen.NAME), unique=True)
    cpc_params = db.relationship('CPC', lazy='joined', backref=db.backref('source', lazy='joined'))

和一个CPC看起来像这样的类:

class CPC(db.Model):
    __tablename__ = 'cpc_tb'
    id = db.Column(db.Integer, primary_key=True)
    provider = db.Column(db.String, db.ForeignKey('feeds_out_tb.username'))

我通过以下代码一次加载:

# Yes, you're missing some attributes in the Model.py, but that's not an issue to understand the problem :)
feed_query = FeedsOut.query.filter(or_(FeedsOut.inactive == False, FeedsOut.inactive == None)).order_by(
            FeedsOut.username)
if usernames:
     feed_query = feed_query.filter(FeedsOut.username.in_(usernames))
feeds = feed_query.options(joinedload(FeedsOut.cpc_params, innerjoin=True), raiseload('*')).all()

查询正在运行并加载所有内容:

Start Query: %s SELECT feeds_out_tb.id AS feeds_out_tb_id, feeds_out_tb.created_at AS feeds_out_tb_created_at, feeds_out_tb.updated_at AS feeds_out_tb_updated_at, feeds_out_tb.username AS feeds_out_tb_username, feeds_out_tb.password AS feeds_out_tb_password, feeds_out_tb.sources AS feeds_out_tb_sources, feeds_out_tb.categories AS feeds_out_tb_categories, feeds_out_tb. job_types AS feeds_out_tb_job_types, feeds_out_tb.b2b_ids AS feeds_out_tb_b2b_ids, feeds_out_tb.keywords AS feeds_out_tb_keywords, feeds_out_tb.radius AS feeds_out_tb_radius, feeds_out_tb.picture AS feeds_out_tb_picture, feeds_out_tb.formatter AS feeds_out_tb_formatter, feeds_out_tb.refreshable AS feeds_out_tb_refreshable, feeds_out_tb.max_count AS feeds_out_tb_max_count, feeds_out_tb.apply_directly AS feeds_out_tb_apply_directly,feeds_out_tb。min_label_tolerated AS feeds_out_tb_min_label_tolerated, feeds_out_tb.max_label_tolerated AS feeds_out_tb_max_label_tolerated, feeds_out_tb.inactive AS feeds_out_tb_inactive, feeds_out_tb.cpc AS feeds_out_tb_cpc, feeds_out_tb.tracking AS feeds_out_tb_tracking, feeds_out_tb.refresh_rate AS feeds_out_tb_refresh_rate, cpc_tb_1.id AS cpc_tb_1_id, cpc_tb_1.provider AS cpc_tb_1_provider, cpc_tb_1.label AS cpc_tb_1_label, cpc_tb_1.price AS cpc_tb_1_price, cpc_tb_1.date AS cpc_tb_1_date, cpc_tb_1.xml_representation AS cpc_tb_1_xml_representation FROM feeds_out_tbid AS cpc_tb_1_id, cpc_tb_1.provider AS cpc_tb_1_provider, cpc_tb_1.label AS cpc_tb_1_label, cpc_tb_1.price AS cpc_tb_1_price, cpc_tb_1.date AS cpc_tb_1_date, cpc_tb_1.xml_representation AS cpc_tb_1_xml_representation FROM feedid AS cpc_tb_1_id, cpc_tb_1.provider AS cpc_tb_1_provider, cpc_tb_1.label AS cpc_tb_1_label, cpc_tb_1.price AS cpc_tb_1_price, cpc_tb_1.date AS cpc_tb_1_date, cpc_tb_1.xml_representation AS cpc_tb_1_xml_representation FROM feed加入 cpc_tb AS cpc_tb_1 ON feeds_out_tb.username = cpc_tb_1.provider WHERE (feeds_out_tb.inactive = false OR feeds_out_tb.inactive 为 NULL) AND feeds_out_tb.username IN (%(username_1)s) ORDER BY feeds_out_tb.username 查询完成!总时间:%f 0.007048130035400391

然后,后来我打电话:provider.cpc_params

然后问题是它重新加载了关系:

formatter AS feeds_out_tb_1_formatter, feeds_out_tb_1.refreshable AS feeds_out_tb_1_refreshable, feeds_out_tb_1.max_count AS feeds_out_tb_1_max_count, feeds_out_tb_1.apply_directly AS feeds_out_tb_1_apply_directly, feeds_out_tb_1.min_label_tolerated AS feeds_out_tb_1_min_label_tolerated, feeds_out_tb_1.max_label_tolerated AS feeds_out_tb_1_max_label_tolerated, feeds_out_tb_1.inactive AS feeds_out_tb_1_inactive, feeds_out_tb_1.cpc AS feeds_out_tb_1_cpc, feeds_out_tb_1.tracking AS feeds_out_tb_1_tracking, feeds_out_tb_1.refresh_rate AS feeds_out_tb_1_refresh_rate FROM cpc_tb 左外连接 feeds_out_tb AS feeds_out_tb_1 ON feeds_out_tb_1.username = cpc_tb.provider WHERE %(param_1)s = cpc_tb.provider 查询完成!总时间:%f 0.0015804767608642578 refreshable AS feeds_out_tb_1_refreshable, feeds_out_tb_1.max_count AS feeds_out_tb_1_max_count, feeds_out_tb_1.apply_directly AS feeds_out_tb_1_apply_directly, feeds_out_tb_1.min_label_tolerated AS feeds_out_tb_1_min_label_tolerated, feeds_out_tb_1.max_label_tolerated AS feeds_out_tb_1_max_label_tolerated, feeds_out_tb_1.inactive AS feeds_out_tb_1_inactive, feeds_out_tb_1.cpc AS feeds_out_tb_1_cpc, feeds_out_tb_1.tracking AS feeds_out_tb_1_tracking, feeds_out_tb_1.refresh_rate AS feeds_out_tb_1_refresh_rate FROM cpc_tb 左外连接 feeds_out_tb AS feeds_out_tb_1 ON feeds_out_tb_1.username = cpc_tb.provider WHERE %(param_1)s = cpc_tb.provider 查询完成!总时间:%f 0.0015804767608642578 refreshable AS feeds_out_tb_1_refreshable, feeds_out_tb_1.max_count AS feeds_out_tb_1_max_count, feeds_out_tb_1.apply_directly AS feeds_out_tb_1_apply_directly, feeds_out_tb_1.min_label_tolerated AS feeds_out_tb_1_min_label_tolerated, feeds_out_tb_1.max_label_tolerated AS feeds_out_tb_1_max_label_tolerated, feeds_out_tb_1.inactive AS feeds_out_tb_1_inactive, feeds_out_tb_1.cpc AS feeds_out_tb_1_cpc, feeds_out_tb_1.tracking AS feeds_out_tb_1_tracking, feeds_out_tb_1.refresh_rate AS feeds_out_tb_1_refresh_rate FROM cpc_tb 左外连接 feeds_out_tb AS feeds_out_tb_1 ON feeds_out_tb_1.username = cpc_tb.provider WHERE %(param_1)s = cpc_tb.provider 查询完成!总时间:%f 0.0015804767608642578 min_label_tolerated AS feeds_out_tb_1_min_label_tolerated, feeds_out_tb_1.max_label_tolerated AS feeds_out_tb_1_max_label_tolerated, feeds_out_tb_1.inactive AS feeds_out_tb_1_inactive, feeds_out_tb_1.cpc AS feeds_out_tb_1_cpc, feeds_out_tb_1.tracking AS feeds_out_tb_1_tracking, feeds_out_tb_1.refresh_rate AS feeds_out_tb_1_refresh_rate FROM cpc_tb LEFT OUTER JOIN feeds_out_tb AS feeds_out_tb_1 ON feeds_out_tb_1.username = cpc_tb.provider WHERE %(param_1)s = cpc_tb.provider 查询完成!总时间:%f 0.0015804767608642578 min_label_tolerated AS feeds_out_tb_1_min_label_tolerated, feeds_out_tb_1.max_label_tolerated AS feeds_out_tb_1_max_label_tolerated, feeds_out_tb_1.inactive AS feeds_out_tb_1_inactive, feeds_out_tb_1.cpc AS feeds_out_tb_1_cpc, feeds_out_tb_1.tracking AS feeds_out_tb_1_tracking, feeds_out_tb_1.refresh_rate AS feeds_out_tb_1_refresh_rate FROM cpc_tb LEFT OUTER JOIN feeds_out_tb AS feeds_out_tb_1 ON feeds_out_tb_1.username = cpc_tb.provider WHERE %(param_1)s = cpc_tb.provider 查询完成!总时间:%f 0.0015804767608642578 refresh_rate AS feeds_out_tb_1_refresh_rate FROM cpc_tb 左外连接 feeds_out_tb AS feeds_out_tb_1 ON feeds_out_tb_1.username = cpc_tb.provider WHERE %(param_1)s = cpc_tb.provider 查询完成!总时间:%f 0.0015804767608642578 refresh_rate AS feeds_out_tb_1_refresh_rate FROM cpc_tb 左外连接 feeds_out_tb AS feeds_out_tb_1 ON feeds_out_tb_1.username = cpc_tb.provider WHERE %(param_1)s = cpc_tb.provider 查询完成!总时间:%f 0.0015804767608642578

我不明白为什么,这个关系还没有加载吗?在堆栈_emit_lazyload中提到了,但我认为它不应该发生,因为一切都应该被加入......

我错过了什么?

标签: pythonsqlalchemy

解决方案


推荐阅读