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

使用redshift_connector调用Redshift存储过程无法获取DataFrame数据

Redshift存储过程调用后无法获取结果数据的解决方法

问题分析

调用Redshift存储过程后仅返回游标名称(如mycursor),是因为refcursor类型的输出参数只是一个游标标识,需要额外执行FETCH语句才能读取游标指向的结果集,直接用fetchall()无法获取存储过程内部查询的数据。

解决步骤

  1. 调用存储过程后,执行FETCH ALL FROM <游标名>语句,让当前游标指向存储过程返回的结果集
  2. 再通过fetchall()获取数据,最后转换为DataFrame

修改后的Python代码

import redshift_connector
import pandas as pd

conn = redshift_connector.connect(
     host='xyz.xyz.region.redshift.amazonaws.com',
     database='db',
     port=5439,
     user="user",
     password='p@@s'
)

cursor = conn.cursor()

try:
    cursor.execute("BEGIN;")
    # 调用存储过程,传入参数和游标名
    cursor.callproc("reporting.procedure", parameters=[1, 'mycursor'])
    # 显式从游标中获取所有数据
    cursor.execute("FETCH ALL FROM mycursor;")
    # 获取结果集
    result_data = cursor.fetchall()
    # 转换为DataFrame(假设结果列名为a)
    df = pd.DataFrame(result_data, columns=['a'])
    print(df)
finally:
    cursor.execute("COMMIT;")
    cursor.close()
    conn.close()

关键说明

  • callproc方法返回的是传入的参数列表(这里就是[1, 'mycursor']),所以直接拿它的返回值得不到数据
  • 必须执行FETCH语句来关联refcursor对应的结果集,之后才能用fetchall()读取数据
  • 如果需要多次读取或者分页,可以用FETCH <行数> FROM mycursor,而不是ALL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:23:11