文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

100%让你在10分钟内学会如何用Python将数据批量的插入到数据库

2024-12-24 16:45

关注

 

本文基于python, 使用pandas, pymysql等三方库实现了向数据库中高效批量插入数据,一方面提供被网上很多瞎转载的答案给坑蒙了的人(因为我也是),一方面自己也做个笔记,以后方便查阅

需求原因

最近在处理一个需求,有关批量往数据库插入数据的,描述如下

版本库信息

逻辑梳理

实际上,最后一步,要写入数据库的文件数据是存储在内存中的。因为读取文件后进行的计算都是在内存中进行的,那么计算的结果也没必要再写到本地,再去读取,再写入数据库,这是会影响程序的效率的。逻辑如下

分步实现及分析

读取文件

给文件路径,然后去读文件就行了,强调一下需要注意的点

  1. import pandas as pd  
  2. import numpy as np 
  3.  
  4. # 当前脚本的位置 
  5. current_folder_path = os.path.dirname(__file__) 
  6.  
  7. # 你的文件的位置 
  8. your_file_path1 = os.path.join(current_folder_path, "文件的名字1"
  9. your_file_path2 = os.path.join(current_folder_path, "文件的名字2"
  10.  
  11. # 我这里是以读取csv文件为例, delimiter为我们内部约定的列之间的分割符 
  12. df1 = pd.read_csv(your_file_path1, dtype={"column1": str, "column2": str}, delimiter="/t"
  13. df2 = pd.read_csv(your_file_path2, dtype={"column1": str, "column2": str}, delimiter="/t"

文件的拼接及计算

文件的拼接主要就是merge和concat两个语法的使用,强调一下小知识点

  1. # 这里以左连接举例, 假设只有两个文件拼接 
  2. ret_df = pd.merge(df1, df2, left_on=["column_name"], right_on=["column_name"], how="left"

初始化连接

导入三方库pymysql,初始化连接

  1. # pymysql的接口获取链接 
  2. def mysql_conn(host, userpassword, db, port=3306, charset="utf8"): 
  3.   # 传参版本 
  4.   conn = pymysql.connect(host=host, user=userpassword=passworddatabase=db, port=port, charset=charset) 
  5.   return conn 

对应接口转换数据

  1. 数据插入要考虑写入一个事务,因为失败的话,要保证对数据库没有影响
  2. 构造符合对应接口的数据格式,通过查询,pymysql有两种可以执行语句的接口
  1. 类似这种: Insert into table_name (column) values (value);
  2. executemany(批量插入语句)

具体实现如下

  1. # 先创建cursor负责操作conn接口 
  2. conn = mysql_conn("your db host""your username""your password""db name"
  3. cursor = conn.cursor() 
  4. # 开启事务 
  5. conn.begin() 
  6.  
  7. #############      构造批量数据的过程            ############# 
  8.  
  9. # 先构造需要的或是和数据库相匹配的列 
  10. columns = list(df.columns) 
  11. # 可以删除不要的列或者数据库没有的列名 
  12. columns.remove("列名"
  13. # 重新构造df,用上面的columns,到这里你要保证你所有列都要准备往数据库写入了 
  14. new_df = df[columns].copy() 
  15.  
  16. # 构造符合sql语句的列,因为sql语句是带有逗号分隔的,(这个对应上面的sql语句的(column1, column2, column3)) 
  17. columns = ','.join(list(new_df.columns)) 
  18.  
  19. # 构造每个列对应的数据,对应于上面的((value1, value2, value3)) 
  20. data_list = [tuple(i) for i in gdsord_df.values] # 每个元组都是一条数据,根据df行数生成多少元组数据 
  21.  
  22. # 计算一行有多少value值需要用字符串占位 
  23. s_count = len(data_list[0]) * "%s," 
  24.  
  25. # 构造sql语句 
  26. insert_sql = "insert into " + "数据库表名" + " (" + columns + ") values (" + s_count[:-1] + ")" 

将数据写入数据库

这个简单,直接上代码

  1. cursor.executemany(insert_sql, data_list) 
  2. conn.commit() 
  3. cursor.close() 
  4. conn.close() 

检查数据库是否插入成功

如果没问题的话,就可以同时进行多个文件读写,计算,最后启用多线程同时向数据库中写入数据了,非常高效!

完整代码

  1. import pandas as pd  
  2. import numpy as np 
  3.  
  4.  
  5. # pymysql接口 
  6. def mysql_conn(host, userpassword, db, port=3306, charset="utf8"): 
  7.   conn = pymysql.connect(host=host, user=userpassword=passworddatabase=db, port=port, charset=charset) 
  8.   return conn 
  9.  
  10.  
  11. # 当前脚本的位置 
  12. current_folder_path = os.path.dirname(__file__) 
  13.  
  14. # 你的文件的位置 
  15. your_file_path1 = os.path.join(current_folder_path, "文件的名字1"
  16. your_file_path2 = os.path.join(current_folder_path, "文件的名字2"
  17.  
  18. # 我这里是以读取csv文件为例, delimiter为我们内部约定的列之间的分割符 
  19. df1 = pd.read_csv(your_file_path1, dtype={"column1": str, "column2": str}, delimiter="/t"
  20. df2 = pd.read_csv(your_file_path2, dtype={"column1": str, "column2": str}, delimiter="/t"
  21. # 合并 
  22. ret_df = pd.merge(df1, df2, left_on=["column_name"], right_on=["column_name"], how="left"
  23.  
  24. # 先创建cursor负责操作conn接口 
  25. conn = mysql_conn("your db host""your username""your password""db name"
  26. cursor = conn.cursor() 
  27. # 开启事务 
  28. conn.begin() 
  29.  
  30. # 先构造需要的或是和数据库相匹配的列 
  31. columns = list(df.columns) 
  32. # 可以删除不要的列或者数据库没有的列名 
  33. columns.remove("列名"
  34. # 重新构造df,用上面的columns,到这里你要保证你所有列都要准备往数据库写入了 
  35. new_df = df[columns].copy() 
  36.  
  37. # 构造符合sql语句的列,因为sql语句是带有逗号分隔的,(这个对应上面的sql语句的(column1, column2, column3)) 
  38. columns = ','.join(list(new_df.columns)) 
  39.  
  40. # 构造每个列对应的数据,对应于上面的((value1, value2, value3)) 
  41. data_list = [tuple(i) for i in gdsord_df.values] # 每个元组都是一条数据,根据df行数生成多少元组数据 
  42.  
  43. # 计算一行有多少value值需要用字符串占位 
  44. s_count = len(data_list[0]) * "%s," 
  45.  
  46. # 构造sql语句 
  47. insert_sql = "insert into " + "数据库表名" + " (" + columns + ") values (" + s_count[:-1] + ")" 
  48. try: 
  49.   cursor.executemany(insert_sql, data_list) 
  50.   conn.commit() 
  51.   cursor.close() 
  52.   conn.close() 
  53. except Exception as e: 
  54.   # 万一失败了,要进行回滚操作 
  55.   conn.rollback() 
  56.   cursor.close() 
  57.   conn.close() 

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯