Python批量写入一亿条业务型数据进oracle

        最近做项目需要大量业务型数据,想到利用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")

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值