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

pd.read_sql传入cx_Oracle游标报错expecting string or bytes object如何解决?

错误原因

你遇到的报错和数据类型转换无关,核心问题是pd.read_sql()的第一个参数要求传入SQL查询字符串,但你传入了已经执行过查询的cx_Oracle.Cursor对象,不符合参数要求才触发了expecting string or bytes object错误。

修复方案

有两种常用的正确写法,你可以按需选择:

  • 方案1(更推荐):直接把SQL字符串传给pd.read_sql,不需要手动创建cursor执行查询,pandas会自动处理全流程:
import cx_Oracle as cx
import pandas as pd

dsn_tns = cx.makedsn('x.x.x.x', 'y', service_name='xxx')
conn = cx.connect(user='x', password='y', dsn=dsn_tns)

# 直接传入SQL字符串
sql_str = """select * from *table_name* partition(p20210712) t"""
df = pd.read_sql(sql_str, conn)
# 查询完成后统一转字符串类型
df = df.astype(str)
  • 方案2:如果需要手动管理cursor,直接从cursor拉取数据构造DataFrame,不需要调用pd.read_sql:
import cx_Oracle as cx
import pandas as pd

dsn_tns = cx.makedsn('x.x.x.x', 'y', service_name='xxx')
conn = cx.connect(user='x', password='y', dsn=dsn_tns)

sql_cursor = conn.cursor()
sql_cursor.execute("""select * from *table_name* partition(p20210712) t""")
# 提取字段名+查询结果构造DataFrame,直接转字符串
columns = [col[0] for col in sql_cursor.description]
df = pd.DataFrame(sql_cursor.fetchall(), columns=columns).astype(str)
问题解答
  • 数据类型转换能不能解决你现在的报错?
    不能。当前报错是传参类型不符合要求导致的,和SQL查询返回的字段类型无关联,即使提前做类型转换也无法修复该错误。
  • 能不能在pd.read_sql语句中直接实现全量字段转字符串?
    pd.read_sql没有提供全表转字符串的直接参数,你可以在调用pd.read_sql后直接链式调用.astype(str),写法和性能都不会有额外损耗。如果是需要指定个别字段的类型,可以通过dtype参数传入字段与类型的映射字典,示例:pd.read_sql(sql_str, conn, dtype={'字段名1': str, '字段名2': int})。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 00:09:03