我正在尝试检查 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:
...
让我们准备一个数据库来测试它。
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!
感谢 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")
我没有评论的声誉。但是,声称最佳答案不正确的评论和答案是错误的。在 Python 中,1 和 0 分别是 True 和 False 的同义词。事实上,用 1 代替 True 和用 0 代替 False 是非常 Pythonic 的,即在 Python 中是高度宽容的。
总之,上面的答案if c.fetchone():
是正确的。
检查是否与 1, if c.fetchone() == 1:
, 相等是不必要的,并且违反了 Python 最佳实践。