首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么SQL炼金术士ORM的许多加入对我来说都是低效的?

为什么SQL炼金术士ORM的许多加入对我来说都是低效的?
EN

Stack Overflow用户
提问于 2022-01-04 18:56:02
回答 1查看 53关注 0票数 1

我正在我的一个类中运行以下查询,其中一个类接受ORM类,以便它可以处理几个类似的表。

代码语言:javascript
复制
(
            self.db.query(self.orm_contact_class)
            .options(
                load_only(
                    self.orm_contact_class.id,
                    self.orm_contact_class.name,
                    self.orm_contact_class.email_attempts_dict,
                ),
                joinedload(
                    self.orm_contact_class.__dict__[self.access_from_contact_to_company]
                ).load_only(self.orm_company_class.domain)
            )
            .where(
                self.orm_contact_class.email == None,
                self.orm_contact_class.name != None,
                self.orm_company_class.domain != None,
                catch_all_conditions
            )
        )

这导致了这个可怕的查询:

代码语言:javascript
复制
SELECT test.crunchbase_people.id AS test_crunchbase_people_id, 
       test.crunchbase_people.name AS test_crunchbase_people_name, 
       test.crunchbase_people.email_attempts_dict AS test_crunchbase_people_email_attempts_dict, 
       crunchbase_companies_1.id AS crunchbase_companies_1_id, 
       crunchbase_companies_1.domain AS crunchbase_companies_1_domain 
FROM test.crunchbase_companies, 
     test.crunchbase_people 
         LEFT OUTER JOIN (
             test.crunchbase_people_crunchbase_companies AS crunchbase_people_crunchbase_companies_1 
                 JOIN test.crunchbase_companies AS crunchbase_companies_1 
                 ON crunchbase_companies_1.id = crunchbase_people_crunchbase_companies_1.crunchbase_companies_id) 
             ON test.crunchbase_people.id = crunchbase_people_crunchbase_companies_1.crunchbase_people_id 
WHERE test.crunchbase_people.email IS NULL AND test.crunchbase_people.name IS NOT NULL AND test.crunchbase_companies.domain IS NOT NULL AND (test.crunchbase_companies.is_domain_catch_all = false OR test.crunchbase_companies.is_domain_catch_all IS NULL)

如果我在Postgres控制台中运行它,它只会一次又一次地返回完全相同行的副本!

因此,它永远无法映射对象,因为查询只需花费很长时间。在没有ORM的情况下,有一种简单的方法可以做到这一点,查询在0.5秒内运行(没有像上面那样的重复),但是我的对象没有映射,这会导致我重构大量代码。

有人知道这样的查询会有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-04 22:23:15

正如最初文章中的评论员所建议的那样,我遗漏了一个显式的联接,因为joinedload并没有替换它,而只是告诉应该预加载哪些字段。

代码语言:javascript
复制
(
            self.db.query(self.orm_contact_class)
            .join(self.orm_contact_class.__dict__[self.access_from_contact_to_company]) # added this line
            .options(
                load_only(
                    self.orm_contact_class.id,
                    self.orm_contact_class.name,
                    self.orm_contact_class.email_attempts_dict,
                ),
                joinedload(
                    self.orm_contact_class.__dict__[self.access_from_contact_to_company]
                ).load_only(self.orm_company_class.domain)
            )
            .where(
                self.orm_contact_class.email == None,
                self.orm_contact_class.name != None,
                self.orm_company_class.domain != None,
                catch_all_conditions
            )
        )
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70583769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档