python读取mysql数据库时,数据量很大的时候(本次实验数据量3000多万条),可以使用流式游标。具体思想如下:使用工具是MySQLdb的流式游标(MySQLdb.cursors.DictCursor),也可以采用SScursor(pymysql.cursors.SScursor)。扩充一点,python的游标有四种(Cursor,SSCursor,DictCursor,SSDictCursor)需要注意的是前两种游标返回值是元组,后面两种游标返回值是字典,需要根据不同的返回值类型对返回值做处理。本次实验中有几个坑需要注意一下:
1,取值时使用fetchone还是fetchall?
如果应对的数据量不大的情况下使用fetchall,但是本人这次实验数据是3000多万条,所以使用fetchone。因为fetchall会把所有据读入内存,造成宕机。
2,fetchone读取的数据print的时候显示都是u'\xxx类型的乱码?
有关乱码原因很多,但是说一个基本乱码调节思路:数据库编码:show variables
like
'character_set_database',查看所有字段编码:show full columns from ****(表名)确认数据表编码格式和连接方式MySQLdb.connect()的连接charset设置一致。这种情况下,还是显示u'\xxxx,这种显示,显示的是Unicode码,并不是乱码,这是因为python默认的编码是ascii编码,还有输出框console的编码,这要这几个都保持一致,就不会出错。如果想看着顺眼一些,有两个解决办法:①,使用python3,python3有效的解决了这个问题。②python2的话,可以使用str().decode('
unicode_escape'),这样可以把Unicode码表显示为中文。但是写入文件的话,不用管只要你确定你的python加了# -*-coding:utf-8 -*-和连接charset一致,这样写入文件基本不会出现乱码。
3,fetchone方法取出数据后,读取时各种报错keyerror?
请根据返回值类型来读取值。如果是元组,请用元组的遍历方式(元组[0],元组[1])取值。如果是字典,请用字典的遍历方式取值(字典['字段名字1'],字典['字段名字2']),等方式来取值。
目前就这么多,出问题再补充吧