在Arm服务器上使用jaybedeapi操作oracle数据库

本文介绍了在基于ARM架构的服务器上,如何使用JayDeBeApi替代cx_Oracle连接Oracle数据库。首先安装JayDeBeApi和JPype1,然后下载ojdbc7.jar。在Python程序中,通过JayDeBeApi建立连接,利用executemany方法进行数据批量插入。特别注意,对于date格式字段,需要转换为特定格式。文章提供了具体的Python代码示例,展示了JayDeBeApi与cx_Oracle在批量插入操作上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在基于arm架构的服务器上,无法使用cx_Oracle,目前使用jaybedeapi成功。

1. 在arm环境的机器上安装jaybedeapi和jpype1,将如下包复制到生产环境下的site-packages下面:

2. 从oracle官网下载ojdbc7.jar并复制到程序所在目录。

 

3. python程序如下:

host = ""
port = "1521"
service_name = ""
url = f'jdbc:oracle:thin:@//{host}:1521/{service_name}'
user = ''
password = ''
dirver = 'oracle.jdbc.driver.OracleDriver'
jarFile = 'ojdbc7.jar'

def run_sql(commandText):    
    connection = jaydebeapi.connect(dirver, url, [user, password], jarFile)
    cursor = connection.cursor()  
    cursor.execute(commandText)     
    cursor.close()  
    connection.close()
    return

4. 批量插入

基于jaydebeapi的数据库批量插入方法与基于cx_Oracle的方式不同,尤其是如果oracle数据库中的字段为date格式,处理方式也是不同的。基于cx_Oracle的方式在之前的文章里已经总结过:

https://mp-new.youkuaiyun.com/mp_blog/creation/editor/113185783

而基于jaydepeapi的处理代码如下:

def data_output(data, int_cols, dataTable):
    '''
    @Args:
        data: dataframe to be inserted.
        int_cols: 整数类型的变量名称
        dataTable: 表名称
    '''      
    connection = jaydebeapi.connect(dirver, url, [user, password], jarFile)
    cursor = connection.cursor()
    query = "INSERT INTO " + "{} ({})" + " VALUES ({})"
    columns = list(data.columns)
    acols = ','.join(columns)
    aidx = ["to_date(:%s, 'yyyy-mm-dd')" % i if i.find('date')>-1 else ':%s' % i for i in columns]    
    aname = ','.join(aidx)    
    query_fmt = query.format(dataTable, acols, aname)  
    data = data.reset_index(drop=True)
    dtHigh = data.shape[0]
    dtWidth = data.shape[1]
    creatVar = locals()
    wholeData = []
    for i in range(dtHigh):
        value_list = {}
        for j in range(dtWidth):      
            f = columns[j]            
            if f in int_cols:
                value_list.update({f: int(data.loc[i, f])})
            else:
                value_list.update({f: data.loc[i, f]})
        wholeData.append(list(value_list.values()))    
    
    cursor.executemany(query_fmt, wholeData)
    cursor.close()
    connection.close()
    print('***data inserted successfully')
    return

区别在于executemany的第二个参数,cx_Oracle支持的是dict形式,而jay支持的形式是list格式。

如果有date变量,需要转成形式insert into table (col1, col2) values (:col1, to_date(:col2, 'yyyy-mm-dd'))的方式传入sql中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值