在 ORM 查询中包含可选字段

发布于 2022-07-28 23:05:16

我正在尝试执行动态查询,但其中三个字段是动态的并且不是必需的。在 SQL Server 中,查询是:

SELECT 
roles.id,
roles.name,
roles.abbreviation,
roles.active,
(CASE WHEN roles.updated_at IS NULL
    THEN roles.created_at
    ELSE roles.updated_at
    END) as last_Modified,
(CASE WHEN user_roles_count.number_of_users IS NULL
    THEN 0
    ELSE user_roles_count.number_of_users
    END) as number_of_users
FROM roles
    LEFT JOIN (SELECT user_roles.role_id, COUNT(user_roles.user_id) as number_of_users
        FROM user_roles GROUP BY user_roles.role_id
    ) as user_roles_count ON roles.id = user_roles_count.role_id ORDER BY roles.id ASC, last_Modified DESC;

列名 roles.name、roles.active 和 ORDER BY last_modified 是动态的,不是必需的。

目前使用 SQLAlchemy 我已经完成了这个

def get_roles(session, offset, limit):
    status_1 = f"""(CASE WHEN roles.updated_at IS NULL
        THEN roles.created_at
        ELSE roles.updated_at
        END) as last_Modified"""
    count_Query = session.query(UserRoles.role_id, func.count(
        UserRoles.user_id).label("number_of_users")).group_by(UserRoles.role_id).subquery()
    status_2 = f"""(CASE WHEN {count_Query.c.role_id} IS NULL
    THEN 0
    ELSE {count_Query.c.role_id}
    END) as number_of_users"""
    statement_result = session.query(
        Roles.id,
        Roles.name,
        Roles.abbreviation,
        Roles.active,
        text(status_1),
        text (status_2)
    ).join(count_Query, count_Query.c.role_id == Roles.id,
    isouter=True).order_by(asc(Roles.id)).slice(offset, limit).all()
    columns = ["id", "name", "abbreviation",
                "active", "updatedAt", "numberOfUsers"]
    get_products = struct_response(statement_result, columns)
    return get_products

如何实现动态字段?

关注者
0
被浏览
34
1 个回答
  • 面试哥
    面试哥 2022-07-28
    为面试而生,有面试问题,就找面试哥。

    您可以构建要包含的字段列表,然后将该 *list 传递给查询,例如,

    from sqlalchemy import Boolean, Column, Integer, select, String
    from sqlalchemy.orm import declarative_base
    
    Base = declarative_base()
    
    
    class Roles(Base):
        __tablename__ = "roles"
        id = Column(Integer, primary_key=True)
        name = Column(String(50))
        abbreviation = Column(String(5))
        active = Column(Boolean)
    
    
    # basic query
    columns_to_include = [Roles.id, Roles.abbreviation]
    query = select(*columns_to_include)
    print(query)
    """
    SELECT roles.id, roles.abbreviation 
    FROM roles
    """
    
    # add optional field
    columns_to_include.append(Roles.name)
    query = select(*columns_to_include)
    print(query)
    """
    SELECT roles.id, roles.abbreviation, roles.name 
    FROM roles
    """
    

    你可以做同样的事情.order_by()

    # basic order_by
    columns_to_order_by = [Roles.id]
    query = select(*columns_to_include).order_by(*columns_to_order_by)
    print(query)
    """
    SELECT roles.id, roles.abbreviation, roles.name 
    FROM roles ORDER BY roles.id
    """
    
    # add another field for select() and order_by()
    columns_to_include.append(Roles.active)
    columns_to_order_by.append(Roles.active)
    query = select(*columns_to_include).order_by(*columns_to_order_by)
    print(query)
    """
    SELECT roles.id, roles.abbreviation, roles.name, roles.active 
    FROM roles ORDER BY roles.id, roles.active
    """
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看