2016-08-24 21 views
0

我有一段工作代碼,但效率非常低,而不是帶有連接的單個查詢。我得到一個初始查詢,然後在響應中每行有一個查詢。在SQLAlchemy中優化hybrid_properties

我有以下情形:

class Job(Base, SerializeMixin, JobInterface): 
    __tablename__ = 'job_subjobs' 

    id = Column(Integer, primary_key=True, autoincrement=True) 
    group_id = Column(Integer, ForeignKey("job_groups.id"), nullable=False) 

class Crash(Base, SerializeMixin): 
    __tablename__ = 'crashes' 

    id = Column(Integer, primary_key=True, autoincrement=True) 
    job_id = Column(Integer, ForeignKey("job_subjobs.id", ondelete='CASCADE'), nullable=False) 

    job = relationship('Job', backref='Crash') 

    @hybrid_property 
    def job_identifier(self): 
     return "{}:{}".format(self.job.group_id, self.job.id) 

因此,考慮上述,我執行了所有崩潰的查詢時,它會執行一個SELECT所有崩潰。當我迭代並要求job_identifier它會爲每次崩潰做一個單獨的SELECT。

self.session.query(Crash).all() 

有什麼方法我可以創建一個@hybrid_property引用不同的表,並將它從一開始就JOIN和預裝的表達?

我用@ xxx.expression進行了試驗,結果沒有成功。如果一切都失敗了,我可以在Crash表中添加另一個外鍵,但是如果可能的話,我想避免改變當前的數據結構。

+0

可以這樣用orm.column_property完成的()?加入兩列與新的column_property形成不同的表格? – graN

+1

這是通過[渴望加載]完成的(http://docs.sqlalchemy.org/en/latest/orm/loading_relationships.html#using-loader-strategies-lazy-loading-eager-loading)。 – univerio

回答

0

最終使用:

jobs = relationship('Job', backref='Crash', lazy='joined')