You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jinja2从SQLite数据库返回错误值问题求助

解决SQLite查询结果传递到HTML时数据表混淆的问题

我帮你捋捋这个问题的核心原因和解决办法——这种「控制台打印正常,但前端展示拿错表数据」的情况,大概率是SQLite游标复用或者数据没有固化导致的,咱们一步步拆解:

最可能的原因:游标被复用,结果集被覆盖

你用的是同一个游标对象c先后执行了两次查询:

comments = c.execute('''SELECT * FROM comments''')
# 然后又执行
newsubs = c.execute('''SELECT * FROM submissions WHERE Signiture = signiture AND Client_ID = client_ID ORDER BY date DESC''')

SQLite的游标是单向、可重复使用的,当你第二次调用c.execute()时,游标会指向新的查询结果,之前的comments结果集其实已经被覆盖了。

你之所以打印comments时是对的,是因为你在第二次执行查询前就循环了comments(游标还没被复用);但等你把comments和newsubs一起传给HTML时,comments已经指向了submissions表的结果,自然就展示错了。

解决办法:固化查询结果

把查询结果转换成列表,把数据从游标里取出来保存,这样就不会被后续的游标操作影响:

# 用fetchall()把查询结果转成列表,彻底固化数据
comments = c.execute('''SELECT * FROM comments''').fetchall()
# 修正你之前的笔误:conn.commit少了括号,统一规范写法
conn.commit()

for each in comments:
    print(each)

# 重点修正:直接拼变量有SQL注入风险,改用参数化查询
newsubs = c.execute('''SELECT * FROM submissions WHERE Signiture = ? AND Client_ID = ? ORDER BY date DESC''', (signiture, client_ID)).fetchall()
conn.commit()

其他需要排查的点

  • HTML模板变量名混淆:检查前端模板里循环的变量名是不是和后端传递的一致,比如有没有把newsubs写成comments,或者反过来?
  • 变量名拼写错误:比如后端传递的是comments,模板里写成了comment(少了s),这种低级错误也可能导致展示异常。

额外提醒

  • 只有增删改操作需要conn.commit(),查询操作其实不需要,但写上也不影响;
  • 永远不要直接把变量拼到SQL语句里,用?占位符+参数元组的方式,既安全又能避免语法错误。

内容的提问来源于stack exchange,提问作者akahypz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:01:18