日常工作中存在oracle数据库中大量生成测试样例的需求,本项工作的难点在于clob类型数据的修改以及插入。由于clob是超大字符类型,所以在插入时不能使用普通的insert语句,在当前工作中一般使用数据库软件中的添加数据行的按钮插入测试数据,但面临大量测试数据的生成工作时,该方式无法满足业务需求,故探索是否可以使用python大量插入clob类型的字段。
一、实现python向oracle中插入clob类型数据
实现方法参考python cx_oracle插入clob类型数据。
#插入数据函数
def insert_clob(SOS_ID,APPDATA,CREDITDATA):
db=oracle.connect('xxxx')
cursor=db.cursor()
sql_insert='insert into sos_data(SOS_ID,APPDATA,CREDITDATA) VALUES(:SOS_ID,:APPDATA,:CREDITDATA)'
clob_data1 = cursor.var(oracle.DB_TYPE_CLOB)
clob_data2 = cursor.var(oracle.DB_TYPE_CLOB)
clob_data1.setvalue(0, APPDATA)
clob_data2.setvalue(0, CREDITDATA)
data = {'SOS_ID': SOS_ID, 'APPDATA': clob_data1, 'CREDITDATA': clob_data2}
cursor.prepare(sql_insert)
cursor.execute(None, data)
db.commit()
cursor.close()
db.close()
SOS_ID='123456'
APPDATA ='这是一个超长超长的文本'
CREDITDATA='这也是一个超长超长的文本'
insert_clob(SOS_ID,APPDATA,CREDITDATA)
数据插入成功!
二、导入测试样例,修改clob类型数据,批量修改批量插入
(一)导入测试样例,将其调整为字典
#导入测试样本
df=pd.read_table(r"D:\Program Files (x86)\PICT\test_res.txt")
#将测试样本转成字典
APPDATA_dict=df.T.to_dict('dict')
如上图所示,需将clob数据中的SUBMITDATE和ENTRYTIME逐行替换,一共生成4条测试数据。
(二)主键随机生成:利用系统时间生成主键
import datetime
#主键生成函数
def ran_sos_id():
time_now=str(datetime.datetime.now())
return "T"+time_now[:4]+time_now[5:7]+time_now[8:10]+time_now[11:13]+time_now[14:16]+time_now[17:19]+time_now[20:22]
(三)替换指定数据,并插入数据库中
假设要修改的SUBMITDATE和ENTRYTIME都在APPDATA中,被修改数据如下:
APPDATA ='''{"DEALER_CURRENT_OVERDUE_APP_NUM": 0,"DEALER_HUKOU_PROVINCE": "浙江省","SUBMITDATE":"2023-01-01","ENTRYTIME": "9999-01-01"}'''
CREDITDATA='这也是一个超长超长的文本'
替换插入可以通过如下代码实现:
for i in np.arange(len(APPDATA_dict)):
re_dict=APPDATA_dict[i]
#读取字典值并替换,根据实际需求调整
#第一个要替换的字段
base=APPDATA.find('SUBMITDATE')
begin=APPDATA.find(':',base,len(APPDATA))
end=APPDATA.find(',',base,len(APPDATA))
APPDATA =APPDATA[:begin+1]+'\"'+str(re_dict['SUBMITDATE'])+'\"'+APPDATA[end:]
#第二个要替换的字段
base=APPDATA.find('ENTRYTIME')
begin=APPDATA.find(':',base,len(base_APPDATA))
end=APPDATA.find(',',base,len(base_APPDATA))
APPDATA =APPDATA[:begin+1]+'\"'+str(re_dict['ENTRYTIME'])+'\"'+APPDATA[end:]
SOS_ID=ran_sos_id()
print('\''+SOS_ID+'\',')
insert_clob(SOS_ID,APPDATA,CREDITDATA)
如上,可完成向oracle中批量插入clob类型测试数据的工作。