Проблема с использованием позиционных параметров в сценарии SQL, используя pg8000 - PullRequest
0 голосов
/ 22 марта 2019

У меня следующий SQL-запрос:

 query_string = "SELECT sum(unmatched), " \
                "TIMESTAMP WITH TIME ZONE 'epoch' + INTERVAL '1 second' * " \
                "round(extract('epoch' from time_window) / {}) * {} as time_window " \
                "FROM aggregate_counts WHERE reconciliation_name = %s " \
                "GROUP BY round(extract('epoch' from time_window) / {})".format(interval_sec, interval_sec, interval_sec)

 cur.execute(query_string, (reconciliation_name))

Он работает нормально, если я не хочу избегать замены строк для "interval_sec" и использовать вместо этого позиционные параметры, как и для других параметров.Проблема в том, что, если я это сделаю:

 query_string = "SELECT sum(unmatched), " \
                "TIMESTAMP WITH TIME ZONE 'epoch' + INTERVAL '1 second' * " \
                "round(extract('epoch' from time_window) / %s) * %s as time_window " \
                "FROM aggregate_counts WHERE reconciliation_name = %s " \
                "GROUP BY round(extract('epoch' from time_window) / %s)"

 cur.execute(query_string, (interval_sec, interval_sec, reconciliation_name, interval_sec))

Я получаю следующую ошибку:

Промежуточное ПО обработчика ошибок перехватило следующее исключение: {'S': 'ERROR', 'V ':' ОШИБКА ',' C ':' 42803 ',' M ':' столбец "aggregate_counts.time_window" должен присутствовать в предложении GROUP BY или использоваться в статистической функции "," P ":" 177 ",'F': 'parse_agg.c', 'L': '1344', 'R': 'check_ungrouped_columns_walker'}

Файловый файл "pg8000 / core.py", строка 1829, в файле execute ps = cache['ps'] [key] KeyError: ("SELECT sum (unmatched), TIMESTAMP с зоной времени 'epoch' + INTERVAL '1 секунда' * round (извлечение ('epoch' из time_window) /% s) *% s какtime_window FROM aggregate_counts WHERE имя согласования =% s GROUP BY round (извлечение ('эпоха' из временного окна) /% s) ", ((701, 1,), (701, 1,), (705, 0, .text_out в 0x10c58cea0>)))

Позиционные параметры могут использоваться только в сравнениях (=,> =,

1 Ответ

0 голосов
/ 22 марта 2019

Так что в принципе это невозможно. Причина в том, что% s в предложении select будет преобразовано, скажем, в позиционный аргумент $ x, а% s в group by будет преобразовано в $ y (x и y - соответствующие позиции). Теперь postgres не может узнать что после разрешения эти два будут одинаковыми. Следовательно, предполагается, что «aggregate_counts.time_window» отсутствует в GROUP BY. Я понимаю, что это не идеальное объяснение, но это то, что происходит.

...