0
我有這個疑問它運行在PostgreSQL的9.1罰款:需要group_by PostgreSQL 8.4中的所有表字段,但不是在9.1中?
tbl_grupos = dbs.query(Grupos).\
join(Cursos).\
join(AlumnosEnGrupos).\
join(Alumnos).\
outerjoin(join_clientes).\
filter(and_(cond_cliente,
cond_curso,
cond_grupo,
cond_grupos,
cond_profesor,
Grupos.fecha_inicio <= self.fecha_fin,
Grupos.fecha_fin >= self.fecha_inicio,
Grupos.confirmado == True,
)).\
order_by(Grupos.nombre, Grupos.id_).\
group_by(Grupos.nombre, Grupos.id_).\
having(func.count(AlumnosEnGrupos.id_) > 0)
當我安裝的PostgreSQL 8.4的遠程服務器上運行它的問題就來了。它給了我下面的錯誤信息:
Error - <class 'sqlalchemy.exc.ProgrammingError'>: (ProgrammingError) column "grupos.resumen_horario" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: ...grupos_fecha_fin, grupos.codigo AS grupos_codigo, grupos.res...
^
'SELECT grupos.id AS grupos_id, grupos.nombre AS grupos_nombre, grupos.fecha_inicio AS grupos_fecha_inicio, grupos.fecha_fin AS grupos_fecha_fin, grupos.codigo AS grupos_codigo, grupos.resumen_horario AS grupos_resumen_horario, grupos.profesores_grupo AS grupos_profesores_grupo, grupos.aulas AS grupos_aulas, grupos.limite_de_entrega_naco AS grupos_limite_de_entrega_naco, grupos.objetivos AS grupos_objetivos, grupos.capacidad AS grupos_capacidad, grupos.cancelaciones_al_mes AS grupos_cancelaciones_al_mes, grupos.horas_de_clase AS grupos_horas_de_clase, grupos.direccion AS grupos_direccion, grupos.estacion AS grupos_estacion, grupos.recibe_avisos AS grupos_recibe_avisos, grupos.recibe_avisos_alumno AS grupos_recibe_avisos_alumno, grupos.cod_objeto AS grupos_cod_objeto, grupos.lugar AS grupos_lugar, grupos.confirmado AS grupos_confirmado, grupos.id_curso AS grupos_id_curso, grupos.id_departamento AS grupos_id_departamento, grupos.id_centro AS grupos_id_centro, grupos.id_aula AS grupos_id_aula, grupos.id_profesor AS grupos_id_profesor, grupos.id_nivel AS grupos_id_nivel \nFROM grupos JOIN cursos ON cursos.id = grupos.id_curso JOIN alumnos_en_grupos ON grupos.id = alumnos_en_grupos.id_grupo JOIN alumnos ON alumnos.id = alumnos_en_grupos.id_alumno LEFT OUTER JOIN clientes ON clientes.id = cursos.id_cliente \nWHERE cursos.id_cliente = %(id_cliente_1)s AND grupos.fecha_inicio <= %(fecha_inicio_1)s AND grupos.fecha_fin >= %(fecha_fin_1)s AND grupos.confirmado = true GROUP BY grupos.nombre, grupos.fecha_inicio, grupos.fecha_fin, grupos.codigo, grupos.id \nHAVING count(alumnos_en_grupos.id) > %(count_1)s ORDER BY grupos.nombre, grupos.fecha_inicio, grupos.fecha_fin, grupos.codigo, grupos.id' {'id_cliente_1': 241, 'fecha_inicio_1': datetime.date(2014, 10, 24), 'fecha_fin_1': datetime.date(2014, 10, 1), 'count_1': 0}
它基本上是說,我需要group_by
列grupos.resumen_horario
。這就是我所做的,然後查詢失敗再次說我不得不將下一列添加到group_by
條款。
我不斷地將表Grupos
中的列添加到group_by
子句中,如錯誤消息所示,直到我意識到這有點荒謬,尤其是考慮到表Grupos
大約有20列。
我想了解正在發生的事情以及如何解決此問題並使查詢在PostgreSQL 8.4中運行,而無需將Grupos
表的所有30列都添加到group_by
子句中。
謝謝你的鏈接Gsiems。所以,爲了讓我的查詢在PostgreSQL 8.4中工作,是否真的必須將組成表的30列添加到'group_by'子句中?這在代碼中看起來很可怕,但我仍然必須嘗試。 – Xar 2014-10-29 20:56:57
@Xar很遺憾,是的 – gsiems 2014-10-29 21:09:04