我正在尝试检查SQLite3数据库中是否存在变量。不幸的是,我似乎无法让它工作。机场表包含3个列,其中ICAO作为第一列。
if c.execute("SELECT EXISTS(SELECT 1 FROM airports WHERE ICAO='EHAM')") is True:
print("Found!")
else:
print("Not found...")
代码运行时没有任何错误,但结果始终相同(未找到)。
此代码有什么问题?
答案 0 :(得分: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
结果元组或无。因此,在您的情况下,if c.fetchone():
将代表下列之一:
if (1, ):
...
或
if None:
...
答案 1 :(得分:0)
让我们准备一个数据库进行测试。
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!
答案 2 :(得分: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")