You need to enable JavaScript to run this app. 使用mysql.connector写入Reddit评论时出现每行仅插入单个字符的问题
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 20:15:03