【问题标题】:flask-sqlalchemy with_entities and relationships带有实体和关系的烧瓶 sqlalchemy
【发布时间】:2016-06-14 03:13:27
【问题描述】:

我想从我的模型中只选择几列来加快查询速度,但我想选择的列之一来自关系。

型号:

class OpenChromatinRegion(db.Model):
    ...
    gene_id     = db.Column(db.Integer, db.ForeignKey("gene.id"), nullable=False, index=True)
    gene        = db.relationship("Gene", back_populates='open_chromatin_regions')

class Gene(db.Model):
    id          = db.Column(db.Integer, primary_key=True)
    ENSEMBLID   = db.Column(db.Integer, index=True, unique=True, nullable=False)
    ...

查询:

q = OpenChromatinRegion.query.with_entities(Gene.ENSEMBLID, ...)...

如何使用我之前尝试过 .with_entities(OpenChromatinRegion.gene.ENSEMBLID) 的 flask-sqlalchemy 从 OpenChromatinRegion 中正确选择几列,但这也不起作用。使用这种语法,我没有收到错误,但请求超时。

【问题讨论】:

    标签: sqlalchemy flask-sqlalchemy


    【解决方案1】:

    你需要加入:

    q = OpenChromatinRegion.query.join(OpenChromatinRegion.gene) \
                                 .with_entities(Gene.ENSEMBLID)
    

    【讨论】:

    • 我认为可能是这种情况,但在我使用“with_entities”之前,我只是取回所有列,并且我能够访问 OpenChromatinRegion.gene。合奏。这是否意味着连接已经在后台进行?
    • @AlexLenail 这意味着它正在做SELECT * FROM open_chromatin_region, gene WHERE ...。这称为交叉连接并产生大量行,这就是您的请求超时的原因。
    • 其实这不是我之前的查询。它是SELECT open_chromatin_region.id, open_chromatin_region.chromosome, (every other column...) FROM open_chromatin_region WHERE open_chromatin_region.gene_id IN (1, 2, 3, etc...); 看来您来自my other question 的评论看起来好像连接不是正确的方法?
    • @AlexLenail 当您想根据该表中的列从另一个表中选择列时,通常可以采用联接。您的另一个问题已被剥夺了具体细节(例如表名),因此很难拼凑起来。您为什么不描述您想要执行的完整查询?
    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2016-09-06
    • 2020-07-11
    • 2020-05-31
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多