10分钟教你Python+MySQL数据库操作 (6)

值得注意的是:本例是以sex为类别进行GROUP BY 分组,加上WHERE来做条件判断,加上ORDER BY 排序,但是GROUP BY 的位置必须要在WHERE 之后,在ORDER BY 之前。

3.6 分批量读取和处理数据

程序运行的时候,数据都是在内存中的,但是有时候如果数据量太大,内存会装不下,这个时候我们就需要分批从数据库去读取数据,然后再处理,等到处理完了之后,再去读取。比如:我们要从customers当中分批读取和处理薪资大于8000的消费者,并将其存入另一张表中。我们的做法是先新建一个表,然后从数据库当中读取3个,并且将读取的这3个进行处理,处理完读取的这三个后,再去数据库重新读取三个,直到数据库的数据读完为止。

# 分批读取并且处理将薪资大于8000的消费者的记录存到另一张表中   # 创建一个临时表    tmpName = \'cust_tmp\'   dropTable(mycursor, tmpName)     mycursor.execute("CREATE TABLE cust_tmp(id INT AUTO_INCREMENT PRIMARY KEY,\                                name VARCHAR(255), address VARCHAR(255), \                                  sex VARCHAR(225), age INT(10), sl INT(10))") ins = con.cursor(buffered=True)   if tableExists(mycursor, tableName):       print("process table: %s", tableName)       # 查询表里的记录       sql = "SELECT * FROM customers WHERE address is not null"       mycursor.execute(sql)       # 每次处理 batchsize 条记录,直到所有查询结果处理完       batchsize = 3       readsize = batchsize       while readsize == batchsize:           print("before batch")           myresult = mycursor.fetchmany(size=batchsize)           for x in myresult:               if x[5]>8000:                   ins.execute("INSERT INTO"+tmpName+"(id,name,address,sex,age,sl) VALUES (%s, %s,%s, %s,%s,%s)", x)                   print(x)           readsize = len(myresult)   else:       print("table: does not exists", tableName)   con.commit()   con.close()  

我们回到workbench找到这个新建的表格cust_tmp,我们可以发现薪资大于8000的消费者都被记录上了:

10分钟教你Python+MySQL数据库操作

执行代码,我们可以看到处理的过程如下:

在第一批读取的三条记录中,只有两条是满足薪资大于8000的要求,第二批读取的三条记录中,只有一条满足薪资大于8000的要求,而在第三批读取的三条记录中,没有任何记录是满足薪资大于8000的要求,当没有记录可以读的时候,程序即停止。

10分钟教你Python+MySQL数据库操作

值得注意的是:就分批读取的batchsize而言,当batchsize太大时,会导致内存装不下,batchsize太小,会导致每次通过网络连接数据库会很慢。因此,我们选取batchsize大小的原则是在内存够用的前提下尽可能的大,在真实的业务场景下,建议每次读取100以上,当内存够用的话,也可以增加至几千上万条。

04小结

本文介绍了Python+MySQL的基本操作,包括如何安装Mysql,如何装驱动,如何创建连接以及对数据库进行增删改查、分组聚合以及批量读取和处理等操作。但是,本文涉及到的只是对单表进行操作,只是数据库操作的冰山一角;在实际的开发和工作环境中,需要根据实际内容对多表进行操作,这部分请持续关注数据魔术师关于数据库的后期推文。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgjppy.html