sqlite3 fetchone() 返回 None 或其他值

Posted

技术标签:

【中文标题】sqlite3 fetchone() 返回 None 或其他值【英文标题】:sqlite3 fetchone() returns None or another value 【发布时间】:2021-04-02 18:03:15 【问题描述】:

我正在学习 Python,发现自己难以解释的行为: 使用 sqlite3 模块,我正在对现有 SQLite 表执行 SQL 查询以获取值。如果 SQL WHERE 子句中的条件为真,我期待一个真实的值,如果条件为假,我正在使用 COALESCE 处理该案例并希望返回一个默认值(在我的案例中为“-1”)。 但是,根据下面的代码示例, fetchone() 将返回一个 None 对象,直到我在所选列上应用聚合函数(在我的例子中为 MAX())。

result = cur.execute('''SELECT coalesce(pin, '-1') inaccuracies
                                    FROM card where number = 'some_incorrect_number' ''').fetchone()
print(result)
# None -- WHY NONE?

result = cur.execute('''SELECT coalesce(max(pin), '-1') 
                                    FROM card where number = 'some_incorrect_number' ''').fetchone()
print(result)
# ('-1',) -- A CORRECT RESULT

你能解释一下为什么 MAX() 解决了这个问题并且我得到了需要的结果,而没有 MAX() 我收到了 None 吗?

抱歉,如果问题中有一些不准确之处。谢谢!

【问题讨论】:

【参考方案1】:

这个查询:

SELECT coalesce(pin, '-1') inaccuracies FROM card where number = 'some_incorrect_number'

如果表中的任何行都不满足 WHERE 子句中的条件并且这是预期的行为,则返回空结果(无行)。

但是,当您使用 MAX()MIN()COUNT()SUM()AVG()GROUP_CONCAT() 等聚合函数时,查询始终返回 1 行,其中 null 作为函数的结果(或0COUNT() 的情况下)如果没有找到匹配项(对于WHERE 子句的条件)或者即使表中没有行。

【讨论】:

感谢您的澄清!我得到了我错过的东西。

以上是关于sqlite3 fetchone() 返回 None 或其他值的主要内容,如果未能解决你的问题,请参考以下文章

数据库查询操作(fetchone,fetchall)

fetchone函数和fetchall函数返回值的区别

python 操作mysql数据中fetchone()和fetchall()

sql查询语句得到返回值fetchone()

c.fetchone()返回'NoneType'?

关于python中的查询数据库内容中用到的fetchone()函数和fetchall()函数(转)