python使用pymysql批量插入数据库5000W条复杂的数据,如何用python脚本实现和用MySQL自定义存储过程实现

python使用pymysql批量插入数据库5000W条复杂的数据,如何用python脚本实现和用MySQL自定义存储过程实现

一、使用Python脚本实现批量插入

import pymysql

# 连接数据库
db = pymysql.connect(host='localhost', user='username', password='password', database='dbname')
cursor = db.cursor()

# 准备数据
data = [
    (1, 'John', 'Doe'),
    (2, 'Jane', 'Smith'),
    # 更多数据...
]

# 生成插入语句
insert_query = "INSERT INTO table_name (id, first_name, last_name) VALUES (%s, %s, %s)"

# 执行批量插入
cursor.executemany(insert_query, data)

# 提交更改
db.commit()

# 关闭连接
cursor.close()
db.close()

当处理大量数据的批量插入时,确保脚本具有错误处理和日志记录是非常重要的。以下是优化后的示例代码,包括错误处理和日志记录:

import pymysql
import logging

# 设置日志
logging.basicConfig(filename='insert_log.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

try:
    # 连接数据库
    db = pymysql.connect(host='localhost', user='username', password='password', database='dbname')
    cursor = db.cursor()

    # 准备数据
    data = [
        (1, 'John', 'Doe'),
        (2, 'Jane', 'Smith'),
        # 更多数据...
    ]

    # 生成插入语句
    insert_query = "INSERT INTO table_name (id, first_name, last_name) VALUES (%s, %s, %s)"

    # 执行批量插入
    cursor.executemany(insert_query, data)

    # 提交更改
    db.commit()

    # 关闭连接
    cursor.close()
    db.close()

    logging.info("批量插入成功")

except Exception as e:
    logging.error(f"批量插入失败: {str(e)}")

二、使用MySQL自定义存储过程实现批量插入

DELIMITER //

CREATE PROCEDURE bulk_insert_data()
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= 500000 DO
        INSERT INTO table_name (id, first_name, last_name) VALUES (i, CONCAT('First', i), CONCAT('Last', i));
        SET i = i + 1;
    END WHILE;
END //

DELIMITER ;

CALL bulk_insert_data();

优化后的存储过程代码,增加了错误处理和日志记录:

DELIMITER //

CREATE PROCEDURE bulk_insert_data()
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE continue_handling BOOLEAN DEFAULT TRUE;
    
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
        SET continue_handling = FALSE;
        ROLLBACK;
        INSERT INTO error_log (error_message) VALUES (CONCAT('Error occurred at iteration ', i, ': ',  MYSQL_ERRNO(), ' - ',  MYSQL_ERROR()));
    END;

    START TRANSACTION;
    WHILE i <= 500000 DO
        BEGIN
            INSERT INTO table_name (id, first_name, last_name) VALUES (i, CONCAT('First', i), CONCAT('Last', i));
            SET i = i + 1;
        END;
    END WHILE;

    IF continue_handling THEN
        COMMIT;
        INSERT INTO success_log (success_message) VALUES ('Bulk insert completed successfully');
    END IF;
    
END //

DELIMITER ;

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

《代码爱好者》

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值