Django ProgrammingError должен появляться в предложении GROUP BY или использоваться в статистической функции - PullRequest
0 голосов
/ 24 октября 2018

Дайте ему любую базовую модель, скажем;

class Post(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(_('Title'), max_length=100)
    content = models.TextField(_('Content html'), max_length=65000)
    author = models.ForeignKey('user.User', on_delete=models.SET_NULL)

Запрос типа Post.objects.annotate(Count('id')) (или любое поле, любое аннотирование ()) завершается с ошибкой:

ProgrammingError: column "post.created" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "post"."id", "post"."created", "post"."ti...

Использование django 1.11.16 и postgres 9.4.19.

Как я читал здесь, в другой вопрос stackoverflow пробовал разные версии django и postgres версии;используя django 2.0, 2.1.2, postgres 9.5 .. та же ошибка!Читая вокруг, я видел, что это может быть проблемой, связанной с SQL, но у меня эта проблема только на одном сервере с Ubuntu 18.04 (бионический).Локальный запуск запроса в Ubuntu 16.04 с django 1.11.16 или любой версией выше и postgres 9.4 или выше работает нормально в моей локальной системе. Так что проблема может быть связана с некоторыми низкоуровневыми библиотекамивозможно, я не выполняю сложные запросы, любой простой annotate () с django 1.11+ не работает в ubuntu 18.04 с postgres 9.4 или 9.5

[ОБНОВЛЕНИЕ] Может быть полезно дляЕсли вы оказались в этом сценарии, не имея ни малейшего представления о том, что происходит, убедитесь, что в рассматриваемой таблице созданы индексы .Моя проблема оказалась в том, что таблица posts не имела ни определения PRIMARY KEY, ни каких-либо других ограничений, сбой в pg_restore, который восстановил все данные, и некоторые определения схемы, да, вы правильно прочитали некоторые другие определения схемы отсутствовали , понятия не имею почему .. Но вместо того, чтобы попытаться отладить то, что произошло с pg_restore, во-первых, я запустил начальный python manage migrate на пустой БД, поэтому схема былаправильно созданный на этот раз и проверенный (psql -d <db_name> -c '\d posts'), затем снова запустите pg_restore с флагами --data-only и --disable-triggers. Итак, наконец-то я получил схему и данные, правильно восстановленные и запрос сработал

1 Ответ

0 голосов
/ 24 октября 2018

Это сообщение об ошибке вызвано тем, что PostgreSQL не будет угадывать, что делать с несгруппированными столбцами, когда в запросе есть агрегатная функция.Это один из случаев, когда Django ORM слишком сильно махает рукой и позволяет нам выстрелить себе в ногу.

Я провел тест на своих проектах, использующих Django 2.1, и другой, который использует 1.11 с Model.objects.annotate(Count('id')) сбез вопросов.Если вы опубликуете полный QuerySet, люди смогут помочь вам в дальнейшем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...