我'我正在使用SQLAlchemy,并且在生成的SQL查询中出现以下错误。我的表格relaciones_laborales
需要加入两个表格funciones_relacion_laboral
,其中字段RelLabId
和puestos
加上字段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'"
答案 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)
)