我正在尝试检查一个变量是否存在于SQLite3数据库中。不幸的是,我似乎无法让它工作。机场表包含3列,ICAO是第一列。
if c.execute("SELECT EXISTS(SELECT 1 FROM airports WHERE ICAO='EHAM')") is True:
print("Found!")
else:
print("Not found...")
这段代码没有出现任何错误,但结果总是相同的(未找到)。
这段代码有什么问题?
我正在尝试检查一个变量是否存在于SQLite3数据库中。不幸的是,我似乎无法让它工作。机场表包含3列,ICAO是第一列。
if c.execute("SELECT EXISTS(SELECT 1 FROM airports WHERE ICAO='EHAM')") is True:
print("Found!")
else:
print("Not found...")
这段代码没有出现任何错误,但结果总是相同的(未找到)。
这段代码有什么问题?
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:
...
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")
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!
我没有足够的声望来评论。然而,那些声称顶部答案是错误的评论和回答是错误的。在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