You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL异步查询执行第二次send_query报错:another command is already in progress

解决PostgreSQL异步查询"another command is already in progress"错误

出现这个错误的核心原因是:当前PostgreSQL连接中还有未完全处理的结果集,导致无法发送新的查询命令。以下是具体的解决方法和修正后的代码:

关键修正点

  1. 调整模式设置顺序:set_single_row_mode 需要在 send_query 之前调用,因为这个配置是针对后续要执行的查询生效的。
  2. 清理所有剩余结果集:每次处理完查询结果后,必须循环调用 get_result 直到返回 nil,确保连接状态完全重置,没有残留的未处理结果。

修正后的代码

raw_conn = ActiveRecord::Base.connection.raw_connection

# 处理第一个查询
raw_conn.set_single_row_mode
raw_conn.send_query("SELECT id FROM users")
begin
  result = raw_conn.get_result
  result.stream_each do |row|
    # 写入文件的逻辑
  end
  # 清理所有剩余结果集,确保连接可用
  while raw_conn.get_result; end
end

# 处理第二个查询
raw_conn.set_single_row_mode
raw_conn.send_query("SELECT id FROM logins")
begin
  result = raw_conn.get_result
  result.stream_each do |row|
    # 写入文件的逻辑
  end
  # 清理所有剩余结果集
  while raw_conn.get_result; end
end

补充说明

PostgreSQL的libpq异步接口要求:一旦发送查询,必须读取该查询产生的所有结果集(包括可能的空结果、通知类信息等),才能在同一个连接上执行新的查询。如果只读取了主结果就停止,连接会维持"命令执行中"的状态,触发你遇到的错误。

内容的提问来源于stack exchange,提问作者tk_0709

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:35:30