python - 在 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': 'ERROR', 'V': 'ERROR', 'C': '42803', 'M': 'column "aggregate_counts.time_window" 必须出现在 GROUP BY子句或在聚合函数中使用','P':'177','F':'parse_agg.c','L':'1344','R':'check_ungrouped_columns_walker'}
文件文件“pg8000/core.py”,第 1829 行,在执行 ps = cache['ps'][key] KeyError: ("SELECT sum(unmatched), TIMESTAMP WITH TIME ZONE 'epoch' + INTERVAL '1 seconds' * round(extract('epoch' from time_window) / %s) * %s as time_window FROM aggregate_counts WHERE revision_name = %s GROUP BY round(extract('epoch' from time_window) / %s)", ((701, 1, ), (701, 1, ), (705, 0, .text_out at 0x10c58cea0>)))
位置参数是否只能用于比较(=、>=、< 等...)?
解决方案
所以基本上不可能有这个。原因是 select 子句中的 %s 将被转换为假设 $x 位置参数,而 group by 中的 %s 将被转换为 $y (x 和 y 是各自的位置。)现在 postgres 无法知道解决后,这两个将是相同的。因此它假定 GROUP BY 中不存在“aggregate_counts.time_window”。我知道这不是完美的解释,但这就是正在发生的事情。
推荐阅读
- javascript - 修复 Vanilla JS Accordion 以一次展开一个选项卡
- r - ggplot2 coord_flip 删除空间
- ruby-on-rails-5 - 如何定义默认语言环境?导轨 5.1
- python - Python while循环有2个变量条件
- perl - 配置 OpenDDS
- asp.net-core - Asp.net Core Identity 使用 AspNetUserClaims 还是 AspNetRoleClaims?
- debugging - Ruby-Rubocop 不适用于 vscode
- javascript - 我的 Javascript 动画无法正常工作。接收类型错误:r 未定义
- react-native - `run-android`时反应本机错误
- azure - 在 Azure HDInsight Blob 存储中读取 csv 文件时出错。