让你在10分钟内把握怎样用Python将数据批量的插入到数据库
副问题[/!--empirenews.page--]
本文基于python, 行使pandas, pymysql等三方库实现了向数据库中高效批量插入数据,一方面提供被网上许多瞎转载的谜底给坑蒙了的人(由于我也是),一方面本身也做个条记,往后利便查阅 需求缘故起因最近在处理赏罚一个需求,有关批量往数据库插入数据的,描写如下 原本的措施是基于sql的存储进程举办数据的更新修改操纵,因为数据量较大,导致对数据库压力太大,于是必要将措施重构为用python读取文件的方法将数据做计较处理赏罚,镌汰这部门的压力,最后仅仅将计较的功效挪用aws的lambda处事从头更新到数据库中就可以了,镌汰了极大的压力,也低落了本钱。涉及数据库首要是插入及更新操纵 版本库信息基于linux体系写的 三方库 >>> pandas 1.0.5, pymysql 0.9.3 python版本 >>> 3.7 尺度库 >> os 逻辑梳理现实上,最后一步,要写入数据库的文件数据是存储在内存中的。由于读取文件后举办的计较都是在内存中举办的,那么计较的功效也没须要再写到当地,再去读取,再写入数据库,这是会影响措施的服从的。逻辑如下 读取文件 文件的拼接及计较,天生新的df 初始化数据库的毗连 将df所需数据转换为元组数据(取决于数据库的三方库的接口是怎样支持批量操纵的) 将数据写入数据库 搜查数据库内容即可 分步实现及说明读取文件 给文件路径,然后去读文件就行了,夸大一下必要留意的点 绝对路径: 这种最简朴,直接给路径字符串就行了,可是一旦文件夹目次布局变革,就必要频仍的改 相对路径: 我一样平常喜痪?在剧本中定位当前剧本的位置,然后通过相对路径去找,这样只要你整个包内部的目次布局稳固革,都不消改,就算陈设上线也是直接按照包的位置来,很利便 pandas默认会将全部数字读取为float范例,以是对付那种看起来是数字,但现实上是必要看成字符串行使的字段举办范例的转换 import pandas as pd import numpy as np
# 当前剧本的位置 current_folder_path = os.path.dirname(__file__)
# 你的文件的位置 your_file_path1 = os.path.join(current_folder_path, "文件的名字1") your_file_path2 = os.path.join(current_folder_path, "文件的名字2")
# 我这里是以读取csv文件为例, delimiter为我们内部约定的列之间的支解符 df1 = pd.read_csv(your_file_path1, dtype={"column1": str, "column2": str}, delimiter="/t") df2 = pd.read_csv(your_file_path2, dtype={"column1": str, "column2": str}, delimiter="/t") 文件的拼接及计较 文件的拼接首要就是merge和concat两个语法的行使,夸大一下小常识点 merge语法首要是对应于sql说话的内毗连,外毗连,左毗连和右毗连等 concat首要是用来将沟通布局的df纯真的拼接起来(也就是列表的总行数增进) # 这里以左毗连举例, 假设只有两个文件拼接 ret_df = pd.merge(df1, df2, left_on=["column_name"], right_on=["column_name"], how="left") 初始化毗连 导入三方库pymysql,初始化毗连 # pymysql的接口获取链接 def mysql_conn(host, user, password, db, port=3306, charset="utf8"): # 传参版本 conn = pymysql.connect(host=host, user=user, password=password, database=db, port=port, charset=charset) return conn 对应接口转换数据 数据插入要思量写入一个事宜,由于失败的话,要担保对数据库没有影响 结构切合对应接口的数据名目,通过查询,pymysql有两种可以执行语句的接口 execute(单条插入语句) 执行单条语句的接口 相同这种: Insert into table_name (column) values (value); executemany(批量插入语句) 执行多条语句的接口 相同这种: Insert into table_name (column1, column2, column3) values (value1, value2, value3); 详细实现如下 # 先建设cursor认真操纵conn接口 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |