python3.3操作MySQL数据库

在用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行插入操作定义一个新的游标。

你可能感兴趣的:(python)