SQLAlchemy通过非标准的多对多表聚合查询

时间:2016-04-28 00:24:13

标签: python sqlalchemy

我有以下架构:

Organization有一个Customer列表,每个Customer都有一个Certification列表。 Customer通过名为Certification的模型与OrganizationCustomerMetadata相关联。 OrganizationCustomerMetadata有一个字符串key,一个字符串value和一个整数customer_id。它只是一个每个客户的键值存储,除了认证映射之外还有其他东西。当key是"认证"时,value是认证ID。 (就在我来到这里的时候。)

我想计算在整个Certification中每个Customer应用Organization的次数。

我写了下面的方法来做到这一点:

def get_user_counts(self, org_id):
    if not org_id:
        return {}
    certs_sql = text(
        '''
        select certifications.id, count(*) as user_count from certifications
        join organization_customer_metadata on value::int = certifications.id and
        key = 'certification'
        join customers on organization_customer_metadata.customer_id = customers.id
        where customers.organization_id = {org_id} and certifications.state = 'ACTIVE'
        group by certifications.id;
        '''.format(org_id=int(org_id)))
    certs_query = db.engine.execute(certs_sql)
    return {row[0]: row[1] for row in certs_query}

这是一个较大的API调用的一部分,用于查询和过滤Certification使用的所有Organization。在计算了认证计数之后,我将其粘贴到要返回的每个Certification上,如下所示:

    # ...some code here that queries for a bunch of certifications...

    user_counts = self.controller.get_user_counts(organization_id)
    for cert in certifications:
        cert.user_count = user_counts.get(cert.id, 0)

我想用正确的sqlalchemy函数重写所有这些。而且我认为我还应该在user_counts模型上设置Certification聚合属性,对吗?我是sqlalchemy的新手,并且在弄清楚如何做到这一点时遇到了很多麻烦。有什么建议吗?

0 个答案:

没有答案