MySQL可正常执行的SQL语句如何改写为PostgreSQL等效语句
MySQL语句转PostgreSQL报错解决方案
报错原因是PostgreSQL严格遵循SQL标准,要求SELECT子句中所有非聚合列必须出现在GROUP BY子句中;而MySQL默认关闭了
ONLY_FULL_GROUP_BYSQL模式,允许非标准的聚合查询语法,因此原写法可以在MySQL正常执行。
针对你的场景(按唯一主键id过滤,匹配的记录最多1条),可以选择以下任意一种方案解决:
- 方案1:对
deleted字段使用聚合函数(推荐,单条记录的MAX/MIN结果和原值完全一致,无需调整后续取值逻辑)
代码示例:cursor.execute("""SELECT COUNT(*), MAX(deleted) AS deleted FROM tweets WHERE id = %s""", (tweet['id'],)) - 方案2:添加GROUP BY子句,把
deleted字段加入分组规则
代码示例:cursor.execute("""SELECT COUNT(*), deleted FROM tweets WHERE id = %s GROUP BY deleted""", (tweet['id'],)) - 方案3:优化冗余逻辑(最优,因为
id是唯一主键,匹配结果最多1条,COUNT统计完全冗余)
直接查询deleted字段即可,根据返回结果判断记录是否存在:cursor.execute("""SELECT deleted FROM tweets WHERE id = %s""", (tweet['id'],)) result = cursor.fetchone() if result: # 记录存在,result[0]即为deleted字段值,对应原写法COUNT(*)=1的场景 deleted = result[0] else: # 记录不存在,对应原写法COUNT(*)=0的场景
内容的提问来源于stack exchange,提问作者E_K
相关产品推荐
相关产品推荐

