Python 检查 SQLite3 中是否存在

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个回答

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:
    ...

5
对我来说这不起作用,因为在sqlite3中,EXISTS运算符始终返回0或1。请参阅文档(http://sqlite.org/lang_expr.html):“ EXISTS运算符始终评估为整数值0和1。如果执行作为EXISTS运算符右操作数指定的SELECT语句将返回一个或多个行,则EXISTS运算符将评估为1。如果执行SELECT不返回任何行,则EXISTS运算符将评估为0。” 因此,您可以将答案从“None”更改为(0,)。如果在接下来的几天里没有人提出异议,我会进行编辑。 - eric

1
感谢zero323的回答,虽然代码片段有误,因为fetchone()不会返回True或False。它只返回1表示True,0表示False(二进制)。以下代码在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")

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!

0

我没有足够的声望来评论。然而,那些声称顶部答案是错误的评论和回答是错误的。在Python中,1和0分别与True和False同义。事实上,将1替换为True,将0替换为False非常符合Python风格,即在Python中高度认可。

简而言之,if c.fetchone():的顶部答案是正确的。

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


并不是这样。在 SELECT EXISTS() 的情况下,c.fetchone() 返回的是一个元组,如 (1,)(0,)。因此,if c.fetchone() 总是为 True,这是有问题的。在我的答案中,SELECT 1 的情况下,c.fetchone() 返回 (1,)None,因此 if c.fetchone() 可以正确地工作。 - John Lin

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