Python检查SQLite3中是否存在

时间:2013-09-15 21:30:52

标签: python-3.x sqlite exists

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

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

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

此代码有什么问题?

3 个答案:

答案 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")