使用mysql.connector写入Reddit评论时出现每行仅插入单个字符的问题
异常根因
- 核心问题来自
executemany的传参逻辑误用:executemany的第二个参数必须是「由多组插入参数构成的可迭代容器」,每组参数需要对应SQL语句中的占位符,通常以元组格式存在。你直接传入字符串类型的comment.body时,Python会把字符串本身识别为可迭代对象,逐次迭代取出单个字符作为每组插入参数,最终就出现每个字符单独存一行的异常。 - 切换为
execute(sql, db)时的报错来源:一方面代码中未定义名为db的变量,传参本身无效;另一方面,即便是单条插入的execute方法,第二个参数也需要把传入值包成元组/列表格式,不能直接裸传字符串。 - 手动给
%s加单引号的操作错误:mysql.connector的参数占位符%s不需要手动包裹引号,驱动会自动完成值的转义和引号匹配,手动加引号后驱动无法识别占位符,就会把字符串%s本身作为字段值存储。
修正方案
由于你是对每条评论执行一次单条插入,不需要用到针对批量写入优化的executemany,直接用单条execute方法并按规范传参即可,代码修正部分如下:
# ---------------- EXE ---------------- # for comment in reddit.subreddit("news").stream.comments(): # 单个参数也要包成元组格式,值后必须加逗号,否则会被识别为普通字符串 mycursor.execute(sql, (comment.body,)) mydb.commit() print(comment.body)
补充优化:如果后续需要提升写入效率、减少数据库交互次数,可以攒取固定批次的评论后再用
executemany批量写入,示例写法:batch_size = 100 # 每100条评论批量写入一次 comment_batch = [] for comment in reddit.subreddit("news").stream.comments(): comment_batch.append((comment.body,)) if len(comment_batch) >= batch_size: mycursor.executemany(sql, comment_batch) mydb.commit() comment_batch.clear() print(comment.body)
内容的提问来源于stack exchange,提问作者A. Prats
相关产品推荐
相关产品推荐

