Unknow列' ColumnName'在ON条款

时间:2018-02-07 16:27:55

标签: python mysql sqlalchemy

我'我正在使用SQLAlchemy,并且在生成的SQL查询中出现以下错误。我的表格relaciones_laborales需要加入两个表格funciones_relacion_laboral,其中字段RelLabIdpuestos加上字段PuestoId

join=(relaciones_laborales.join(
    funciones_relacion_laboral.join(
        funciones_asignadas.join(
            sillas.join(
                silla_grupo_materia.join(
                    puestos, (relaciones_laborales.c.PuestoId ==
                              puestos.c.PuestoId)),
                sillas.c.SillaId == silla_grupo_materia.c.SillaId,
                isouter=True),
            sillas.c.SillaId == funciones_asignadas.c.SillaId),
        (funciones_asignadas.c.FuncAsignadaId ==
         funciones_relacion_laboral.c.FuncAsignadaId)),
    relaciones_laborales.c.RelLabId == funciones_relacion_laboral.c.RelLabId)) 

然后我用

构造查询
query = sa.select(...).select_from(join)

我收到以下错误:

1054, u"Unknown column 'RELACIONES_LABORALES.PuestoId' in 'on clause'"

1 个答案:

答案 0 :(得分:-1)

为了清楚起见,我们使用一个更简单的例子。给定表 x y z

x, y, z = [Table(t, metadata, Column('i', Integer))
           for t in ['x', 'y', 'z']]

诸如

之类的陈述
j = x.join(y.join(z, x.c.i == z.c.i), y.c.i == x.c.i)

生成一个编译为

的SQL表达式对象
x JOIN (y JOIN z ON x.i = z.i) ON y.i = x.i

因为最内层表达式首先被计算,作为参数传递给封闭函数调用,依此类推。括号中的连接优先,但此时没有可见的表 x 。另一方面,如果你改变了形成连接的方式并将它们链接起来:

j = x.\
    join(y, y.c.i == x.c.i).\
    join(z, z.c.i == x.c.i)

你得到了

x JOIN y ON y.i = x.i JOIN z ON z.i = x.i

这可能是你追求的。所以记住这一点:

join = (
    relaciones_laborales.

    join(funciones_relacion_laboral,
         relaciones_laborales.c.RelLabId ==
         funciones_relacion_laboral.c.RelLabId).

    join(funciones_asignadas,
         funciones_asignadas.c.FuncAsignadaId ==
         funciones_relacion_laboral.c.FuncAsignadaId).

    join(sillas,
         sillas.c.SillaId == funciones_asignadas.c.SillaId).

    join(silla_grupo_materia,
         sillas.c.SillaId == silla_grupo_materia.c.SillaId,
         isouter=True).

    join(puestos,
         relaciones_laborales.c.PuestoId == puestos.c.PuestoId)
)