8

我正在尝试检查 SQLite3 数据库中是否存在变量。不幸的是,我似乎无法让它工作。机场表包含 3 列,第一列是 ICAO。

if c.execute("SELECT EXISTS(SELECT 1 FROM airports WHERE ICAO='EHAM')") is True:
    print("Found!")
else:
    print("Not found...")

代码运行没有任何错误,但结果始终相同(未找到)。

这段代码有什么问题?

4

4 回答 4

9

试试这个:

c.execute("SELECT EXISTS(SELECT 1 FROM airports WHERE ICAO='EHAM')")

if c.fetchone():
    print("Found!")

else:
    print("Not found...")

的返回值cursor.execute是游标(或者更准确地说是对自身的引用)并且与查询结果无关。您可以轻松检查:

 >>> r = c.execute("SELECT EXISTS(SELECT 1 FROM airports WHERE ICAO='EHAM')")
 >>> r is True
 False
 >>> r is False
 False
 >>> r is None
 False

 >>> r is c
 True

另一方面,如果您调用cursor.fetchone结果元组或 None 如果没有通过查询条件的行。因此,在您的情况下if c.fetchone():,这意味着以下之一:

if (1, ):
    ...

或者

if None:
    ...
于 2013-09-15T21:38:29.207 回答
1

让我们准备一个数据库来测试它。

import sqlite3
c = sqlite3.connect(":memory:")
c.execute("CREATE TABLE airports (ICAO STRING, col2 STRING, col3 STRING)")
c.execute("INSERT INTO airports (ICAO, col2, col3) VALUES (?, ?, ?)", ('EHAM', 'value2', 'value3'))

既然你SELECT 1 FROM airports WHERE ICAO = 'EHAM'已经服务于检查存在的目的了,让我们直接使用它,没有多余的SELECT EXISTS()

if c.execute("SELECT 1 FROM airports WHERE ICAO = 'EHAM'").fetchone():
    print("Found!")
else:
    print("Not found...")

结果是

Found!

让我们检查一个不存在的案例

if c.execute("SELECT 1 FROM airports WHERE ICAO = 'NO-SUCH'").fetchone():
    print("Found!")
else:
    print("Not found...")

结果是

Not found...

如果您只想修复代码,可以尝试

if c.execute("SELECT EXISTS(SELECT 1 FROM airports WHERE ICAO = 'EHAM')").fetchone() == (1,):
    print("Found!")
else:
    print("Not found...")

结果是

Found!
于 2020-11-30T13:05:20.273 回答
0

感谢 zero323 的回答,虽然代码片段是错误的,因为fetchone()不返回 True 或 False。它只为 True 返回 1,为 False 返回 0。(二进制)以下代码在 Python3 中没有问题:

response = self.connection.execute("SELECT EXISTS(SELECT 1 FROM invoices WHERE id=?)", (self.id, ))
fetched = response.fetchone()[0]
if fetched == 1:
    print("Exist")
else:
    print("Does not exist")
于 2021-07-02T12:56:22.007 回答
0

我没有评论的声誉。但是,声称最佳答案不正确的评论和答案是错误的。在 Python 中,1 和 0 分别是 True 和 False 的同义词。事实上,用 1 代替 True 和用 0 代替 False 是非常 Pythonic 的,即在 Python 中是高度宽容的。

总之,上面的答案if c.fetchone():是正确的。

检查是否与 1, if c.fetchone() == 1:, 相等是不必要的,并且违反了 Python 最佳实践。

于 2021-09-21T18:47:02.840 回答