即使存在值,cursor.fetchone()仍会返回None。

4
我正在尝试找出如何从UserID中获取单个值并在控制台中打印它。我的当前代码一直返回“None”,即使我正在搜索的UserID有Currency的值。
cursor.execute("SELECT Currency FROM ServerUsers WHERE USERID = %s" % (userid))
    if cursor.fetchone():
        a = cursor.fetchone()
        print(a)

1
你有一个不平衡的括号和一个SQL注入攻击的绝佳机会。不要在SQL查询中使用%字符串格式化! - Klaus D.
嗨,谢谢。我已经修复了括号,但仍然返回无结果。我不担心 SQL 注入攻击,因为这只是几个朋友之间的个人项目。 - cute
你预计从这个结果中会得到多少行? - cs95
1
你在if语句中调用了fetchone(),然后将该结果丢弃,并再次调用了fetchone() - John Gordon
@Klaus D. 感谢您提醒我,我会尝试今天修复它。每个用户只有一行记录,我想获取特定用户的货币金额并将其打印到控制台。谢谢,删除if语句解决了问题。我以为这个值会保留。 - cute
显示剩余2条评论
2个回答

11
当您调用execute时,结果会被计算和获取,您可以使用fetchone/fetchmany/fetchall来检索结果。在您的情况下,查询返回一个单一行作为结果,因此在if中调用cursor.fetchone将导致结果被获取并随后被丢弃,因此对fetchone的另一个调用将产生None,因为指针已经超过结果集中唯一的一行。判断数据是否存在的 SQLite 纯正方式是查询一行并测试其真实性-
result = cursor.fetchone()
if result:
    print(result)

今天我才知道“truthiness”这个词的存在!:')-感谢您的答案,我之前并没有意识到可以像这样检查对象的真/假。 - Jordan Atkinson

1

我曾经遇到和你一样的问题。我使用了Sqlite和Pycharm编辑器,通过在Pycharm中刷新我使用的数据库(View->Tool Windows->Database->Refresh),我解决了这个问题。我知道成功率很低,但我希望这能帮助有相同问题的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接