PostgreSQL异步查询执行第二次send_query报错:another command is already in progress
解决PostgreSQL异步查询"another command is already in progress"错误
出现这个错误的核心原因是:当前PostgreSQL连接中还有未完全处理的结果集,导致无法发送新的查询命令。以下是具体的解决方法和修正后的代码:
关键修正点
- 调整模式设置顺序:
set_single_row_mode需要在send_query之前调用,因为这个配置是针对后续要执行的查询生效的。 - 清理所有剩余结果集:每次处理完查询结果后,必须循环调用
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
相关产品推荐
相关产品推荐

