您的位置:首页 > 编程语言 > Python开发

python3.3操作MySQL数据库

2016-01-05 17:32 567 查看
在用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行插入操作定义一个新的游标。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: