前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用python将逐条insert转为批量insert

使用python将逐条insert转为批量insert

原创
作者头像
保持热爱奔赴山海
发布于 2025-04-24 07:22:16
发布于 2025-04-24 07:22:16
7600
代码可运行
举报
文章被收录于专栏:数据库相关数据库相关
运行总次数:0
代码可运行

需求背景

研发有时候交付过来一批sql,(可能是navicat之类的客户端导出的)

todo.sql 文件内容类似如下:

代码语言:sql
AI代码解释
复制
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');
INSERT INTO `sbtest`.`sbtest123`( `name`, `age`, `sex`) VALUES ('zhangsan',22,'Male');

这是一批逐条insert的语句,插入数据库会很慢。

因此考虑将其转为批量插入方式,提升其导入效率。

代码实现

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 将多行的逐条insert文件,合并为N个批量insert sql。注意每条insert必须是在每一行,不能换行。

import os
import subprocess

# 待处理的文件名(这里需要根据实际情况修改)
origial_file="todo.sql"

# 切分的行数(这里为了演示调的比较小,生产建议设为1000到5000
batch_size=10

# 数据库的表名和列名(这里需要根据实际情况修改)
column_list=" `name`, `age`, `sex`"
table_name="`sbtest`.`sbtest`"




# 清理下环境,防止有老的文件存在
try:
    os.remove('batch.sql')
except:
    pass

# 将某个文件按照每1k行切分为一个个小文件,文件名以output_开头
command = f"split -l {batch_size} {origial_file} output_"
result = subprocess.run(command, shell=True, check=True)

# 检查命令的输出
if result.returncode == 0:
    print("Command executed successfully!")
else:
    print("Command failed with return code:", result.returncode)
    sys.exit(10)


# 获取当前目录
current_directory = os.getcwd()
# 遍历当前目录下的所有文件和目录
for filename in os.listdir(current_directory):
    # 检查文件是否以output_开头
    if filename.startswith("output_"):
        print(filename)
        with open (filename,'r') as f:
            #insert_statements=f.readlines()
            insert_statements = [line.strip() for line in f.readlines()]

        # print(insert_statements)
        # 提取每条语句的VALUES部分
        values = [stmt.rstrip(';\n').split("VALUES")[1] for stmt in insert_statements]
        print(values)

        # 拼接成一条合并的INSERT语句
        merged_statement = f"INSERT INTO {table_name} ({column_list}) VALUES " + ", ".join(values) + ';\n'

        with open ('batch.sql','a') as ff:
            ff.write(merged_statement)

        try:
            os.remove(filename)
        except:
            pass


生成的sql如下:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求背景
  • 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档