2014-10-29 41 views
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_bygrupos.resumen_horario。這就是我所做的,然後查詢失敗再次說我不得不將下一列添加到group_by條款。

我不斷地將表Grupos中的列添加到group_by子句中,如錯誤消息所示,直到我意識到這有點荒謬,尤其是考慮到表Grupos大約有20列。

我想了解正在發生的事情以及如何解決此問題並使查詢在PostgreSQL 8.4中運行,而無需將Grupos表的所有30列都添加到group_by子句中。

回答

2

它曾經是Postgresql所需的所有非聚合列分組。從(我認爲)版本9.1開始,現在可以按主鍵列進行分組(如果它們是查詢的一部分)。有一個寫作here,這可能有助於解釋。

更新:作爲他的「等待9.1」系列帖子的一部分,Depesz大肆宣傳here

+0

謝謝你的鏈接Gsiems。所以,爲了讓我的查詢在PostgreSQL 8.4中工作,是否真的必須將組成表的30列添加到'group_by'子句中?這在代碼中看起來很可怕,但我仍然必須嘗試。 – Xar 2014-10-29 20:56:57

+1

@Xar很遺憾,是的 – gsiems 2014-10-29 21:09:04

相關問題