如何使用Pandas在Oracle中克隆SCOTT.EMP表为TEST表并保证数据类型一致
如何使用Pandas在Oracle中克隆SCOTT.EMP表为TEST表并保证数据类型一致
嘿,我来帮你搞定这个问题!要在Python的Pandas里把Oracle的SCOTT.EMP表完整克隆成TEST表,还得保证数据类型完全匹配,其实分两步走就很稳妥:先精准复刻原表的结构,再导入数据,这样就不会出现类型不匹配的坑啦。
方法一:通过DDL语句复刻表结构(推荐)
这种方法能完全照搬原表的字段类型、约束(比如NOT NULL),是最靠谱的方式:
先安装必要的依赖库
打开终端执行:pip install pandas sqlalchemy cx-oracle连接到Oracle数据库
替换下面代码里的数据库账号、密码、主机、端口和服务名:import pandas as pd from sqlalchemy import create_engine # 构建Oracle连接引擎 engine = create_engine('oracle+cx_oracle://SCOTT:tiger@你的主机地址:端口号/服务名')获取EMP表的建表DDL并修改为TEST表的DDL
我们用Oracle自带的DBMS_METADATA工具获取原表的建表语句,然后把表名替换成TEST:with engine.connect() as conn: # 查询EMP表的完整建表语句 ddl_result = conn.execute("SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMP', 'SCOTT') FROM DUAL") emp_ddl = ddl_result.fetchone()[0] # 将DDL中的EMP替换为TEST,注意大小写要和原表一致 test_ddl = emp_ddl.replace('"EMP"', '"TEST"').replace('EMP', 'TEST') # 执行DDL创建TEST表 with engine.connect() as conn: conn.execute(test_ddl)读取EMP数据并写入TEST表
现在表结构已经和EMP完全一致,直接导入数据即可:# 读取EMP表的所有数据 emp_df = pd.read_sql('SELECT * FROM SCOTT.EMP', engine) # 将数据写入TEST表,因为表已存在,用append模式 emp_df.to_sql('TEST', engine, schema='SCOTT', if_exists='append', index=False)
方法二:手动指定数据类型写入
如果因为权限问题没法用DBMS_METADATA,可以手动映射每个字段的Oracle数据类型,然后用Pandas创建表并写入:
from sqlalchemy.types import Integer, String, Date, Numeric # 手动对应原表的每个字段类型,根据你提供的DESC结果补充完整 dtype_mapping = { 'EMPNO': Integer(), # 对应NUMBER(4) 'ENAME': String(length=10), # 对应VARCHAR2(10) 'JOB': String(length=9), # 对应VARCHAR2(9) 'MGR': Integer(), # 对应NUMBER(4) 'HIREDATE': Date(), # 对应DATE 'SAL': Numeric(precision=7, scale=2), # 假设原表SAL是NUMBER(7,2),请根据实际调整 # 补充其他字段比如COMM、DEPTNO的类型 } # 读取数据 emp_df = pd.read_sql('SELECT * FROM SCOTT.EMP', engine) # 写入TEST表,用replace模式创建表,同时指定数据类型 emp_df.to_sql('TEST', engine, schema='SCOTT', if_exists='replace', index=False, dtype=dtype_mapping)
这种方法需要你准确对应每个字段的类型,不如第一种方法省心,但在特殊场景下也能用。
备注:内容来源于stack exchange,提问作者Veera V
相关产品推荐
相关产品推荐

