如何将Excel识别的多份pandas DataFrame分配ID后以blob存入Oracle
将pandas DataFrame转换为Blob存入Oracle数据库的实现方案
核心思路
pandas DataFrame无法直接作为Blob存储,核心是先将DataFrame序列化为二进制字节流,再将字节流作为Blob字段值写入Oracle表。常用两种序列化方案,可按需选择:
- pickle序列化:Python原生支持,可完整保留DataFrame的所有属性(如自定义dtype、索引元信息等),仅适合Python环境读取
- Parquet序列化:跨语言通用列式存储格式,存储压缩率高,版本兼容性好,支持多语言读取,优先推荐使用
步骤1:序列化DataFrame为二进制字节流
方案A:pickle序列化
import pandas as pd from io import BytesIO # 你的DataFrame对象 df = pd.DataFrame(...) buf = BytesIO() df.to_pickle(buf) buf.seek(0) df_blob = buf.read()
方案B:Parquet序列化(推荐)
需要先安装依赖:pip install pyarrow
import pandas as pd from io import BytesIO buf = BytesIO() # 可加compression='gzip'开启压缩,减少存储体积 df.to_parquet(buf, engine='pyarrow', compression='gzip') buf.seek(0) df_blob = buf.read()
步骤2:写入Oracle数据库
使用Oracle官方驱动oracledb实现写入,旧版cx_Oracle逻辑完全一致:
import oracledb import uuid # 替换为你的数据库连接信息 conn = oracledb.connect(user="用户名", password="密码", dsn="数据库DSN") cursor = conn.cursor() # 生成唯一DF_ID,也可按业务规则使用Oracle序列、自增主键等 df_id = str(uuid.uuid4()) # 执行插入 insert_sql = "INSERT INTO 你的目标表名 (DF_ID, DF_BLOB) VALUES (:1, :2)" cursor.execute(insert_sql, (df_id, df_blob)) conn.commit() # 关闭资源 cursor.close() conn.close()
步骤3:从Oracle读取Blob恢复为DataFrame
对应pickle序列化的读取逻辑
query_sql = "SELECT DF_BLOB FROM 你的目标表名 WHERE DF_ID = :1" cursor.execute(query_sql, (df_id,)) retrieved_blob = cursor.fetchone()[0] buf = BytesIO(retrieved_blob) df = pd.read_pickle(buf)
对应Parquet序列化的读取逻辑
query_sql = "SELECT DF_BLOB FROM 你的目标表名 WHERE DF_ID = :1" cursor.execute(query_sql, (df_id,)) retrieved_blob = cursor.fetchone()[0] buf = BytesIO(retrieved_blob) df = pd.read_parquet(buf, engine='pyarrow')
注意事项
- pickle序列化存在版本兼容问题,读写两端的pandas、Python版本差异过大可能导致反序列化失败
- 100M以上的大体积DataFrame建议开启Parquet的gzip压缩,存储体积可降至原有的1/10甚至更低,pandas读取时会自动识别压缩格式无需额外处理
- 写入超大Blob时可开启Oracle的流式写入参数,避免内存溢出
内容的提问来源于stack exchange,提问作者codingsnake99
相关产品推荐
相关产品推荐

