SQLalchemy在单个对象中从多个表中获取数据

2024-05-14 16:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有3个表,用户,项目和项目_用户是_管理表,我正在尝试编写ORM以从中获取数据

我的模型在这里:https://pastebin.com/ZrmhKyNL

在简单的SQL中,我们可以连接并选择特定的列,并获得所需的输出。但在ORM中,当我编写如下查询时:

sql = """ select * from 
            projects p, users u, projects_users pu 
            where
            p.name = '%s' and
            p.id = pu.project_id and 
            pu.user_id = u.id and
            p.is_active = true and 
            u.is_active = true 
        """ % project_name

它工作正常,并以以下格式返回响应:

[ { 以上3个表的所有列。 } ]

但是,当我尝试将其转换为sqlalchamey ORM时,效果并不理想:

return (
        db.query(User)
        .filter(Project.id == ProjectsUser.project_id)
        .filter(ProjectsUser.user_id == User.id)
        .filter(Project.is_active == True)
        .filter(User.is_active == True)
        .filter(Project.name == project_name)
        .all()
    )

我想将is_admin值与用户对象一起返回。这似乎是非常常见的用例,但我找不到任何与SQLalchemy ORM相关的解决方案


Tags: and项目用户nameprojectidisorm
1条回答
网友
1楼 · 发布于 2024-05-14 16:32:09

如果这是一对一的关系,这意味着对于每个用户,在admin表中只能有一个条目,那么可以添加一列作为反向引用:

class User(Base):
    id = ...
    name = ...
    last_login = ...
    admin = relationship("Admin", uselist=False, back_populates="user")

class Admin(Base):
    id = ...
    is_admin = ...
    user_id = Column(Integer, ForeignKey('user.id'))
    user = relationship("User", back_populates="admin")

然后,您可以只查询表用户,并通过user.admin.is_admin访问关系中的值

阅读更多:

相关问题 更多 >

    热门问题