我有以下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': '错误','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 ps =缓存['ps'] [键] KeyError :(“ SELECT sum(未匹配),带有时区的时间戳'epoch'+ INTERVAL'1second'* * round(从time_window提取('epoch')/%s)*%s作为time_window从gregation_counts中,reconciliation_name =%s GROUP BY round(从time_window提取('epoch')/%s)“,(((701,1,),(701,1,),(705,0,.text_out at 0x10c58cea0>)))
位置参数只能用于比较(=,> =,<等...)吗?
答案 0 :(得分:0)
所以基本上不可能有这个。原因是select子句中的%s将被转换为$ x位置参数,group by中的%s将被转换为$ y(x和y为各自的位置。)现在postgres无法知道解决后,这两个将是相同的。因此,它假定GROUP BY中不存在“ aggregate_counts.time_window”。我知道这不是一个完美的解释,但这是正在发生的事情。