代码之家  ›  专栏  ›  技术社区  ›  keturn

风暴中的多对一属性

  •  0
  • keturn  · 技术社区  · 14 年前

    我的模式如下所示:

    CREATE TABLE plans (
        id SERIAL PRIMARY KEY,
        description text
    );
    
    CREATE TABLE projects (
        id SERIAL PRIMARY KEY,
        project_id character varying(240) UNIQUE,
        plan_id integer REFERENCES plans(id) ON DELETE CASCADE
    );
    

    我想根据

    plan = store.find(Plan, Plan.project_id == "alpha")
    # should translate to something like
    # SELECT p.* from plans p LEFT JOIN projects proj ON p.id = proj.plan_id
    #     WHERE proj.project_id = 'alpha';
    

    (注意 projects.plan_id 不是唯一的。

    我该如何设置?

    1 回复  |  直到 13 年前
        1
  •  2
  •   James Henstridge    14 年前

    对于给定的SQL,没有太多的理由使用左联接,因为WHERE子句与没有相应项目的任何行都不匹配。您可以通过以下方式获得结果:

    result = store.find(Plan, Plan.id == Project.plan_id, Project.project_id == "alpha")
    

    这将给您一个resultset对象。考虑到您的模式,看起来您只需要一行,所以您可以通过以下方式访问:

    plan = result.one()
    

    或者把它们都绑在一起:

    plan = store.find(Plan, Plan.id == Project.plan_id, Project.project_id == "alpha").one()
    

    如果您真的需要执行左联接,其语法如下:

    result = store.using(LeftJoin(Plan, Project, Plan.id == Project.plan_id)).find(
        Plan, Project.project_id == "alpha")