使用pandas to_sql写入Oracle 19c数据库数据类型不一致问题咨询
解决方案
1. 修正代码语法错误
你提供的代码存在两处语法错误,会导致dtype参数无法正常生效,是字段类型映射异常的常见诱因:
oracle_dtypes字典中swear_words字段定义末尾缺少逗号to_sql方法的index=False参数末尾缺少逗号
2. 解决字符串长度超限问题
Oracle数据库默认配置下,VARCHAR2类型的最大存储长度为4000字节,你为swear_words字段设置的长度9999超过了该阈值,SQLAlchemy会自动将超长的字符串类型映射为CLOB。
- 如果字段实际存储内容不超过4000字节,直接将长度调整为4000以内即可
- 如果确实需要存储更长的字符串,可先将Oracle的
MAX_STRING_SIZE参数调整为EXTENDED(调整后VARCHAR2最大支持32767字节),再对应设置字段长度
3. 统一使用Oracle专属方言类型
避免混用SQLAlchemy通用类型和Oracle方言类型,防止出现映射冲突,所有字段类型优先使用sqlalchemy.dialects.oracle下的专属类型。
4. 预处理DataFrame空值
写入前将所有字符串类型字段的空值统一填充为''(空字符串),避免pandas将携带空值的字符串字段推断为未知类型,导致SQLAlchemy无法匹配到正确的映射规则。
修正后的参考代码
from sqlalchemy.dialects.oracle import NUMBER, VARCHAR2, DATE # 全量使用Oracle方言类型,字符串长度控制在规则范围内 oracle_dtypes = { 'id' : NUMBER(38,0), 'counts' : NUMBER(10,0), 'name' : VARCHAR2(50), 'swear_words' : VARCHAR2(4000), # 长度调整到4000以内,调整过MAX_STRING_SIZE可设为9999 'date' : DATE() } # 预处理字符串字段空值 str_cols = df_upload.select_dtypes(include='object').columns df_upload[str_cols] = df_upload[str_cols].fillna('') df_upload.to_sql( "oracle_table", db.engine, schema="SA_COVID", if_exists="replace", index=False, dtype=oracle_dtypes )
5. 适配依赖版本
确认使用的依赖版本互相兼容,推荐使用SQLAlchemy 1.4及以上、pandas 1.5及以上版本,Oracle驱动优先使用官方新版python-oracledb,替代旧版cx_Oracle,避免旧版本存在的已知类型映射bug。
内容的提问来源于stack exchange,提问作者Jennings
相关产品推荐
相关产品推荐

