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
相关产品推荐
相关产品推荐

