在基于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中。