商务网站开发实验,电商平台代运营,win10做网站,国内营销推广渠道一、大批量插入数据
对于 大量数据插入时#xff0c;虽然pyDAL也手册中有个方法#xff1a;bulk_insert()#xff0c;但是手册也说了#xff0c;虽然方法上是一次可以多条数据#xff0c;如果后端数据库是关系型数据库#xff0c;他转换为SQL时它是一条一条的插入的虽然pyDAL也手册中有个方法bulk_insert()但是手册也说了虽然方法上是一次可以多条数据如果后端数据库是关系型数据库他转换为SQL时它是一条一条的插入的只有在NoSQL数据库时能提速bulk_insert()的用法如下感兴趣的看看
db.person.bulk_insert([{name:Alex,age:11}, {name: John,age:22}, {name: Tim,age:33}])那后端是关系数据库时有其他办法吗答案是我们利用前面 我们提到db.executesql()方法直接用SQL,下面是例子
1、目标
MySQL数据库我们一次插入2000万的csv文件普通PC是无法直接打开这么多行的数据文件的
2、解决思路
1分块读取分块插入我们已知csv各列的名为col1,col2,col3我们每次读10万行插入库10万行
2使用db.executesql()方法编写SQL批量插入语句
3特别注意将你的数据库的单条语句的数据包大小适当调大。就mysql而言
# 服务器接受的数据包的大小在执行数据量较大的单条语句,如果超过了默认限制,就会报错,提示这个参数大小不足max_allowed_packet100M
3、MySQL批量插入数据语法
INSERT INTO table_name (column1, column2,...) VALUES (value1_1, value1_2,...), (value2_1, value2_2, ...)......;
4、示例代码
我们使用到了pandas库pandas的read_csv()方法可以对非常方便的对大文件分块读取
import pandas as pd
df_chunk pd.read_csv(my.csv, chunksize100000, iteratorTrue)
for chunk in df_chunk:insert_values for row in range(0, chunk.shape[0]):insert_values ( str(chunk.iloc[row,0]) , str(chunk.iloc[row,1]) , str(chunk.iloc[row,2]) ),db.executesql(INSERT INTO my_table (col1,col2,col3) VALUES insert_values[:- 1] ;)db.commit() 二、对于结果集很大的查询做遍历循环iterselect 如果我们要对一个查询结果集做遍历循环且结果数据很大例如
for row in db(db.IMEI_table.IMEI.contains(666)).select():
.....
常规的上述写法一定是先查询得到 完整的结果放在内存中在做遍历循环很吃内存性能也低针对这种情况pyDAL提供了iterselect()方法使用也很方便如下 for row in db(db.IMEI_table.IMEI.contains(666)).iterselect(): ...
当数据量较大时iterselect()不仅速度快还节省内存