涉及许多表的复杂“烧瓶” -SQLAlchemy查询

时间:2020-05-18 17:31:03

标签: python sql flask sqlalchemy flask-sqlalchemy

我有5张桌子:

用户,项目,Dg,Ds和R。

项目有3种隐私模式:私人,公共,项目

我需要的是:

  • 在Project.mode为公共项目中,所有DG的DG
  • 如果Project.mode = private,则属于该项目中用户DG的所有R
  • 如果Project.mode = project,则属于同一Project中所有其他用户DG的所有R

这些关系是:

1个n用户项目

1 n Dg项目

1 n用户Dg

1 n Dg Ds

1 n Ds R

它们可以是多个查询,也可以只是一个。如果有人会提供帮助或提供一些可以帮助的资源,我将不胜感激。我看过其他类似的问题,但是我是这个主题的新手,无法推断。

1 个答案:

答案 0 :(得分:0)

from sqlalchemy.orm import aliased

Dg2 = aliased(Dg)
# project-wide visible R
result1 = db.session.query(
    R, Ds.name).join(
    Ds).join(
    Dg).join(
    Project).filter(
        Project.acces_rights == 'project').join(
    Dg2).filter(
        Dg2.user_id == user_id)

# personal R
result2 = db.session.query(
    R, Ds.name).join(
    Ds).join(
    Dg).filter(
        Dg.user_id == user_id).join(
    Project).filter(
        Project.acces_rights == 'own'
    )

# all publicly visible reading points
result3 = db.session.query(
    R, Ds.name).join(
    Ds).join(
    Dg).join(
    Project).filter(
        Project.acces_rights == 'public')

results = result1.union(result2).union(result3)