使用pg8000

时间:2019-03-22 14:02:38

标签: python postgresql pg8000

我有以下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>)))

位置参数只能用于比较(=,> =,<等...)吗?

1 个答案:

答案 0 :(得分:0)

所以基本上不可能有这个。原因是select子句中的%s将被转换为$ x位置参数,group by中的%s将被转换为$ y(x和y为各自的位置。)现在postgres无法知道解决后,这两个将是相同的。因此,它假定GROUP BY中不存在“ aggregate_counts.time_window”。我知道这不是一个完美的解释,但这是正在发生的事情。