01需求原因
最近在处理一个需求,有关批量往数据库插入数据的,描述如下:原来的程序是基于sql的存储过程进行数据的更新修改操作,由于数据量较大,导致对数据库压力太大,于是需要将程序重构为用python读取文件的方式将数据做计算处理,减少这部分的压力,最后仅仅将计算的结果调用aws的lambda服务重新更新到数据库中就可以了,减少了极大的压力,也降低了成本。涉及数据库主要是插入及更新操作。02版本库信息
基于linux系统写的三方库pandas1.0.5,pymysql0.9.3python版本3.7标准库os03逻辑梳理
实际上,最后一步,要写入数据库的文件数据是存储在内存中的。因为读取文件后进行的计算都是在内存中进行的,那么计算的结果也没必要再写到本地,再去读取,再写入数据库,这是会影响程序的效率的。逻辑如下:首先读取文件文件的拼接及计算,生成新的df初始化数据库的连接将df所需数据转换为元组数据(取决于数据库的三方库的接口是如何支持批量操作的)再将数据写入数据库检查数据库内容04分步实现及分析
读取文件给文件路径,然后去读文件就行了,强调一下需要注意的点绝对路径:这种最简单,直接给路径字符串就行了,但是一旦文件夹目录结构变化,就需要频繁的改相对路径:我一般喜欢先在脚本中定位当前脚本的位置,然后通过相对路径去找,这样只要你整个包内部的目录结构不变化,都不用改,就算部署上线也是直接根据包的位置来,很方便pandas默认会将所有数字读取为float类型,所以对于那种看起来是数字,但实际上是需要当作字符串使用的字段进行类型的转换文件的拼接及计算文件的拼接主要就是merge和concat两个语法的使用,强调一下小知识点merge语法主要是对应于sql语言的内连接,外连接,左连接和右连接等concat主要是用来将相同结构的df单纯的拼接起来(也就是列表的总行数增加)初始化连接导入三方库pymysql,初始化连接对应接口转换数据数据插入要考虑写入一个事务,因为失败的话,要保证对数据库没有影响构造符合对应接口的数据格式,通过查询,pymysql有两种可以执行语句的接口a)execute(单条插入语句)执行单条语句的接口,类似这种:Insertintotable_name(column)values(value);b)executemany(批量插入语句)执行多条语句的接口,类似这种:Insertintotable_name(column1,column2,column3)values(value1,value2,value3);具体实现如下将数据写入数据库这个简单,直接上代码检查数据库是否插入成功如果没问题的话,就可以同时进行多个文件读写,计算,最后启用多线程同时向数据库中写入数据了,非常高效05完整代码
如果觉得写的还行,就点个