最近做项目需要大量业务型数据,想到利用Python写入随机数据进行循环调用。
数据准备
首先在txt文件上罗列需要用到的业务型数据,考量其可用性、可实现性等
在代码中将txt文档罗列的数据提取出来
import random
import faker
# 省份表
str_prov = ("河北、山西、辽宁、吉林、黑龙江、江苏、浙江、安徽、福建、江西、山东、河南、湖北、湖南、广东、海南、"
"四川、贵州、云南、陕西、甘肃、青海、台湾、内蒙古、广西、西藏、宁夏、新疆、北京、天津、上海、重庆、香港、澳门")
lst_prov = str_prov.split('、')
my_prov = random.choice(lst_prov)
print("省份:" + my_prov)
# 职级表
str_rank = ("神王级、混沌主宰、永恒真神级、虚空真神级、真神级、宇宙之主级、尊者级、不朽级、界主级、域主级、"
"宇宙级、恒星级、行星际、国际级、国家级、省级、市州级、县级、村级、生产大队级")
lst_rank = str_rank.split('、')
my_rank = random.choice(lst_rank)
print("职级:" + my_rank)
# 所属项目表
str_prj = ("游泳、射箭、田径、羽毛球、拳击、篮球、皮划艇、自行车、马术、击剑、足球、竞技体操、"
"艺术体操、蹦床、手球、曲棍球、柔道、现代五项、赛艇、帆船、射击、乒乓球、跆拳道、网球、铁人三项、"
"排球、举重、摔跤、棒球、垒球、保龄球、台球、板球、体育舞蹈、壁球、武术、围棋、象棋、藤球、橄榄球、"
"轮滑、空手道、卡巴迪、高尔夫球、龙舟")
lst_prj = str_prj.split('、')
my_prj = random.choice(lst_prj)
print("所属项目:" + my_prj)
# 审批人员表
lst_approve = ["张三", "李四", "王五", "刘鎏", "齐琦", "赵强"]
my_approve = random.choice(lst_approve)
print("审批人:" + my_approve)
# 审批状态表
lst_status = ["通过", "驳回", "审批中"]
my_status = random.choice(lst_status)
print("审批状态:" + my_status)
# 服务评分表
lst_rating = [1, 2, 3, 4, 5]
my_rating = random.choice(lst_rating)
print("服务评分:{0}".format(my_rating))
# 性别表
lst_sex = ["男", "女"]
my_sex = random.choice(lst_sex)
print("性别:" + my_sex)
# 收入表
my_income = random.randint(1000, 40000)
print("收入:{0}".format(my_income))
# 年龄表
my_age = random.randint(21, 55)
print("年龄:{0}".format(my_age))
# 时间表
lst_time = ['2023/9/1 0:00:00', '2023/9/2 0:00:00', '2023/9/3 0:00:00', '2023/9/4 0:00:00', '2023/9/5 0:00:00',
'2023/9/6 0:00:00', '2023/9/7 0:00:00', '2023/9/8 0:00:00', '2023/9/9 0:00:00', '2023/9/10 0:00:00',
'2023/9/11 0:00:00', '2023/9/12 0:00:00', '2023/9/13 0:00:00', '2023/9/14 0:00:00', '2023/9/15 0:00:00',
'2023/9/16 0:00:00', '2023/9/17 0:00:00', '2023/9/18 0:00:00', '2023/9/19 0:00:00', '2023/9/20 0:00:00',
'2023/9/21 0:00:00', '2023/9/22 0:00:00', '2023/9/23 0:00:00', '2023/9/24 0:00:00', '2023/9/25 0:00:00',
'2023/9/26 0:00:00', '2023/9/27 0:00:00', '2023/9/28 0:00:00', '2023/9/29 0:00:00', '2023/9/30 0:00:00',]
my_time = random.choice(lst_time)
print("时间:{0}".format(my_time))
# 姓名表
f = faker.Faker("zh_CN")
my_name = f.name()
print("姓名:" + my_name)
需要将这些数据聚合在一张列表中,然后进行定量循环
data_lst = [(f.name(), random.choice(lst_sex), random.randint(21, 55), random.choice(lst_prov),
random.choice(lst_rank), random.randint(1000, 40000), random.choice(lst_prj),
random.choice(lst_time), random.choice(lst_approve), random.choice(lst_status),
random.choice(lst_rating)) for _ in range(100000)]
print(data_lst)
使用Python将MySQL数据库查询到的数据写入oracle数据库中
首先创建连接
# 创建ORACLE数据库连接
conn = cx_Oracle.connect('用户名', '密码', 'IP:端口/服务名')
# 获取操作游标
cursor = conn.cursor()
添加数据sql
# 添加数据sql
sql_ora = ("INSERT INTO REIMBURSEMENT_ONE_HUNDRED_MILLION (NAME, SEX, AGE, PROVINCE, RANK, "
"INCOME, BELONG_PROJECT, REPORT_TIME, APPROVER, APPROVAL_STATUS, SERVICE_RATING)"
" VALUES (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11)")
写入Oracle数据库中,当含有日期类型的数据,需要执行时间类型固定SQL
# 需要执行sql语句,将时间类型固定
sql_ora_1 = "alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SS.FF'"
cursor.execute(sql_ora_1)
conn.commit()
执行写入SQL语句时,使用for循环,循环次数为mysql提取到的列表的长度,需要设置步长控制性能
# 设置并发数量
batch_size = 100000
# 使用循环执行SQL语句
for i in range(0, len(data), batch_size):
cursor.executemany(sql_ora, data[i:i + batch_size])
使用threading函数,进行并发执行,使用分隔,将500个并发分隔为20个线程一组(由于数据库的断开和重连会消耗时间,需要联系运维将数据库的连接时间设置长一点)
# 将之分为20个线程为一组
def thread_func_20():
for i in range(20):
oracle_con()
# 500个线程分为25组20个
def many_thread():
for i in range(25):
t = threading.Thread(target=thread_func_20())
t.start()
源码
# -*- coding: utf8 -*-
import cx_Oracle
import os
import time
import threading
from datetime import datetime
import random
import faker
# 指定Oracle文件位置
cx_Oracle.init_oracle_client(lib_dir=r"E:\awork\rj\oracleeee\instantclient_19_24")
# 编码转换
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
def lst_data():
# 省份表
str_prov = ("河北、山西、辽宁、吉林、黑龙江、江苏、浙江、安徽、福建、江西、山东、河南、湖北、湖南、广东、海南、"
"四川、贵州、云南、陕西、甘肃、青海、台湾、内蒙古、广西、西藏、宁夏、新疆、北京、天津、上海、重庆、香港、澳门")
lst_prov = str_prov.split('、')
my_prov = random.choice(lst_prov)
# print("省份:" + my_prov)
# 职级表
str_rank = ("神王级、混沌主宰、永恒真神级、虚空真神级、真神级、宇宙之主级、尊者级、不朽级、界主级、域主级、"
"宇宙级、恒星级、行星际、国际级、国家级、省级、市州级、县级、村级、生产大队级")
lst_rank = str_rank.split('、')
my_rank = random.choice(lst_rank)
# print("职级:" + my_rank)
# 所属项目表
str_prj = ("游泳、射箭、田径、羽毛球、拳击、篮球、皮划艇、自行车、马术、击剑、足球、竞技体操、"
"艺术体操、蹦床、手球、曲棍球、柔道、现代五项、赛艇、帆船、射击、乒乓球、跆拳道、网球、铁人三项、"
"排球、举重、摔跤、棒球、垒球、保龄球、台球、板球、体育舞蹈、壁球、武术、围棋、象棋、藤球、橄榄球、"
"轮滑、空手道、卡巴迪、高尔夫球、龙舟")
lst_prj = str_prj.split('、')
my_prj = random.choice(lst_prj)
# print("所属项目:" + my_prj)
# 审批人员表
lst_approve = ["张三", "李四", "王五", "刘鎏", "齐琦", "赵强"]
my_approve = random.choice(lst_approve)
# print("审批人:" + my_approve)
# 审批状态表
lst_status = ["通过", "驳回", "审批中"]
my_status = random.choice(lst_status)
# print("审批状态:" + my_status)
# 服务评分表
lst_rating = [1, 2, 3, 4, 5]
my_rating = random.choice(lst_rating)
# print("服务评分:{0}".format(my_rating))
# 性别表
lst_sex = ["男", "女"]
my_sex = random.choice(lst_sex)
# print("性别:" + my_sex)
# 收入表
my_income = random.randint(1000, 40000)
# print("收入:{0}".format(my_income))
# 年龄表
my_age = random.randint(21, 55)
# print("年龄:{0}".format(my_age))
# 时间表
lst_time = ['2023/9/1 0:00:00', '2023/9/2 0:00:00', '2023/9/3 0:00:00', '2023/9/4 0:00:00', '2023/9/5 0:00:00',
'2023/9/6 0:00:00', '2023/9/7 0:00:00', '2023/9/8 0:00:00', '2023/9/9 0:00:00', '2023/9/10 0:00:00',
'2023/9/11 0:00:00', '2023/9/12 0:00:00', '2023/9/13 0:00:00', '2023/9/14 0:00:00', '2023/9/15 0:00:00',
'2023/9/16 0:00:00', '2023/9/17 0:00:00', '2023/9/18 0:00:00', '2023/9/19 0:00:00', '2023/9/20 0:00:00',
'2023/9/21 0:00:00', '2023/9/22 0:00:00', '2023/9/23 0:00:00', '2023/9/24 0:00:00', '2023/9/25 0:00:00',
'2023/9/26 0:00:00', '2023/9/27 0:00:00', '2023/9/28 0:00:00', '2023/9/29 0:00:00',
'2023/9/30 0:00:00', ]
my_time = random.choice(lst_time)
# print("时间:{0}".format(my_time))
# 姓名表
f = faker.Faker("zh_CN")
my_name = f.name()
# print("姓名:" + my_name)
# 循环生成数据
data_lst = [(f.name(), random.choice(lst_sex), random.randint(21, 55), random.choice(lst_prov),
random.choice(lst_rank), random.randint(1000, 40000), random.choice(lst_prj),
random.choice(lst_time), random.choice(lst_approve), random.choice(lst_status),
random.choice(lst_rating)) for _ in range(200000)]
return data_lst
def oracle_con():
# 调用函数结果
data = lst_data()
print("随机列表读取成功" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
# 创建ORACLE数据库连接
conn = cx_Oracle.connect('用户名', '密码', 'IP:端口/服务名')
# 获取操作游标
cursor = conn.cursor()
# 添加数据sql
sql_ora = ("INSERT INTO REIMBURSEMENT_ONE_HUNDRED_MILLION (NAME, SEX, AGE, PROVINCE, RANK, "
"INCOME, BELONG_PROJECT, REPORT_TIME, APPROVER, APPROVAL_STATUS, SERVICE_RATING)"
" VALUES (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11)")
# 需要执行sql语句,将时间类型固定
sql_ora_1 = "alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SS.FF'"
cursor.execute(sql_ora_1)
conn.commit()
# 设置并发数量
batch_size = 10000
# 使用循环执行SQL语句
for i in range(0, len(data), batch_size):
try:
cursor.executemany(sql_ora, data[i:i + batch_size])
except Exception as e:
print(e)
# 提交SQL语句
conn.commit()
# 关闭连接,释放资源
cursor.close()
conn.close()
print("oracle数据写入成功:" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
# 将之分为20个线程为一组
def thread_func_20():
for i in range(20):
oracle_con()
# 500个线程分为25组20个
def many_thread():
for i in range(25):
t = threading.Thread(target=thread_func_20())
t.start()
# 使用并发执行
if __name__ == '__main__':
many_thread()
其他几个点
安装cx_oracle包需要Python3.10以下的版本;
执行cx_oralce包需要配置Oracle环境,配置了环境变量,但还是找不到Oracle包,只有在代码中指定oracle文件位置;
# 指定Oracle文件位置
cx_Oracle.init_oracle_client(lib_dir=r"E:\awork\rj\oracleeee\instantclient_19_24")