在 sql 脚本中使用位置参数(使用 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: ("选择总和(不匹配), 时区时间戳 '纪元' + 间隔 '1 秒' * round(提取('epoch' from time_window)/%s) * %s 作为time_window 从 aggregate_counts 其中 reconciliation_name = %s 分组依据 round(extract('epoch' from time_window)/%s)", ((701, 1, ), (701, 1, ), (701, 1, ), (705, 0, .text_out at 0x10c58cea0>)))

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

所以基本上不可能有这个。原因是选择子句中的%s将被转换为位置参数$x,而分组依据中的%s将被转换为$y(x和y是各自的位置)。现在 postgres 无法知道解决后,这两者会是一样的。因此,它假定 GROUP BY 中不存在 "aggregate_counts.time_window"。我知道这不是完美的解释,但这就是正在发生的事情。

相关内容

  • 没有找到相关文章

最新更新