【问题标题】:Python check if exists in SQLite3Python 检查 SQLite3 中是否存在
【发布时间】:2013-09-19 23:51:13
【问题描述】:

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

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

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

这段代码有什么问题?

【问题讨论】:

    标签: python-3.x sqlite exists


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 这对我不起作用,因为 EXISTS 在 sqlite3 中返回 0 或 1。请参阅文档 (sqlite.org/lang_expr.html):“EXISTS 运算符始终计算为整数值 0 和 1 之一。如果执行指定为 EXISTS 运算符右侧操作数的 SELECT 语句将返回一行或多行,则EXISTS 运算符的计算结果为 1。如果执行 SELECT 将根本不返回任何行,则 EXISTS 运算符的计算结果为 0。" 因此,您可以将答案从 None 更改为 (0,)。如果接下来几天没有人反对,我会编辑。
    【解决方案2】:

    让我们准备一个数据库来测试它。

    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!
    

    【讨论】:

      【解决方案3】:

      感谢 zero323 的回答,虽然代码 sn-p 是错误的,因为 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")
      

      【讨论】:

        【解决方案4】:

        我没有评论的声誉。但是,声称最高答案不正确的 cmets 和答案是错误的。在 Python 中,1 和 0 分别是 True 和 False 的同义词。事实上,用 1 代替 True 和用 0 代替 False 非常符合 Python 风格,即在 Python 中被高度容忍。

        总之if c.fetchone():的置顶答案是正确的。

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

        【讨论】:

          猜你喜欢
          • 2018-04-22
          • 2015-07-14
          • 2012-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-30
          • 2016-11-05
          • 1970-01-01
          相关资源
          最近更新 更多