python3.3操作MySQL数据库

本文分享了使用Python处理大量MySQL数据库数据的经验,包括如何避免内存溢出、合理利用游标及解决执行SQL语句时出现的各种问题。
部署运行你感兴趣的模型镜像

在用python3.3操作MySQL数据库时把折腾的比较狠,好在通过大神的提点解决了。

有一些数据,这些数据是将整个网页以HTML存在数据库中的,我需要将它们取出来清洗然后再存回另外一个数据库。这时就出现了如下一些问题:

  1. 数据量比较大,在数据小的时候可以直fetchall 然后再对数据进行修改,存入数据库,但是数据量大的时候就不行了,实验几次,每次都是在90000+的时候挂掉了,出的错误Google都找不到,not enough parameters for SQL statement,明明之前的90000+的数据都可以,这就突然不可用了。郁闷。
  2. 既然这种方法不可用,那就用fetchmany取一点,处理一点,再存入数据库中,速度慢点,应该可以吧。可是问题又来了。首先是游标cursor,数据库中的游标是在内存中开辟的一块区域,是和SQL结果绑定的,如果先执行查询操作,中间执行插入操作,显然不能再回到之前的查询操作接着执行了,所以要为插入操作重新定义一个cursor。这样还不够,执行查询语句后如果不读取数据,在执行插入和更新操作时会提示unread result found有未读结果,解决这个问题的办法stackflow上说定义cursor时设置buffered = True这样数据就是直接读到buffer了。

这样折腾下来总算解决了这个问题。最大收获是,理解了cursor,游标,顾名思义可以把它理解为指针或引用,这样就理解了为什么在一条SQL语句没有完全处理完转而去执行另一条SQL时会出现各种奇葩的错误了,比如

query_result = cursor.fetchmany(5)
    while query_result:
        param = []
        for row in query_result:
            row = list(row)
            user = row[3].decode().split("_", 1)
            row[5] = clear_data(row[5].decode())
            data = row[0:3] + user + row[4:]
            param.append(data)
        #print(param)
        try:
            cursor.executemany(insert_data, param)
            con.commit()
        except mysql.connector.Error as connect_err:
            print("mysql Error(1):{}".format(connect_err.msg))
        query_result = cursor.fetchmany(5)

上述代码中的第12行中就是在查询语句执行后,跳转去执行插入语句,而后在第16行又执行查询语句,显然,这个过程中cursor的对象变了,不可能在接着第1行获取的五条数据后的第6条再次获取了。cursor对象对应执行的SQL语句完全乱了,最好的办法是重新为第6行插入操作定义一个新的游标。

关注作者公众号

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值