python 操作oracle可以采用cx_Oracle库,更方便的,如果数据是在pandas dataframe中,则可以换一种方式,结合 sqlalchemy库,实现更高效的存储方式。
pandas dataframe 的结果更好的存入oracle。可以使用 to_sql。
df.to_sql(name='table_name',con='sqlalchemy_engine',if_exists='append',index=False)
sqlalchemy_engine ?
from sqlalchemy import create_engine
engine = create_engine(connect_str , echo=True, encoding='utf8',convert_unicode=True)
connect_str ?
通常来说:比如oracle
oracle://username:password@host:port/database_name?charset=utf8
但是会报 sid 找不到的错误。用以下方式解决:
dsnStr = cx_Oracle.makedsn(host,port,servicename)
dsnStr = dsnStr.replace("SID","SERVIEC_NAME")
connect_str = "oracle://username:password@"+ dsnStr
有可能会遇到编码问题,比如数据库 nls_characterset 是 zhs16gbk
需要设置:
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
非常方便!
如果需要将数据直接读入df:
eng_con =engine.connect()
outpx = eng_con.execute(sql_str)
df = pd.DataFrame(outpx.fetchall())
df.columns = outpx.keys()
从hive读取数据?
from pyhive import hive
conn = hive.Connection(host=,port=,username=,database=)
cursor = conn.cursor()
cursor.execute()
pd.DataFrame(cursor.fetchall())
cursor.close()
conn.close()
一般场景从hive读取数据,经过分析处理后存入oracle,方便前台取用。直接用pandas相关的read_sql to_sql读取数据和存入数据,借助sqlalchemy库非常方便。
主要面临的问题通常是编码问题,因为hive、环境、oracle三方可能存在不一致的问题。需要特别注意。
领取专属 10元无门槛券
私享最新 技术干货