【问题标题】:Python if statement skipping code even though condition is met即使满足条件,Python if 语句也会跳过代码
【发布时间】:2015-07-12 01:37:41
【问题描述】:

我正在尝试检查一个条目是否已经在数据库中,如果没有则添加该条目,但即使满足条件,if 语句也不会运行。

        userCurs.execute("SELECT EXISTS(SELECT 1 FROM images WHERE imageLink=?)", (image,))
        exists = userCurs.fetchone()
        if exists is None:
            addImage(userName,image,'','')
        else:
            print '--------> image skipped'
            print userCurs.fetchone()

我得到这个输出:

--------> image skipped
None
--------> image skipped
None

数据库中没有任何条目

【问题讨论】:

  • 你给fetchone打了两次电话。这可能是个问题吗?
  • 当我将其更改为存在时,我得到--------> image skipped (0,) --------> image skipped (0,)
  • 你调用了两次fetchOne,如果你在最后一行print exists呢?

标签: python-2.7 if-statement


【解决方案1】:

SQL 语句:

SELECT EXISTS(SELECT 1 FROM images WHERE imageLink=?)

将始终返回一行。该行中列的值将是 EXISTS() 函数的结果,如果找到任何匹配项,则为 TRUE,否则为 FALSE。

由于您的原始代码仅测试结果中是否存在一行,并且完整的语句将始终只返回一行,因此您会得到您所看到的行为。

我认为你应该做的是让你的查询返回一个行集,如果没有找到匹配项,则返回一个行集,如果找到匹配项,则返回一个(或更多)行:

userCurs.execute("SELECT 1 FROM images WHERE imageLink=?", (image,))

现在您的原始测试应该可以工作了 - 如果没有 imageLinks 与查询匹配,那么结果中将没有行,因此第一个 fetchone() 将返回一个空对象,如您所料。

当然,正如其他几个人所提到的,您应该每行只调用一次fetchone(),因为它会移动光标。

【讨论】:

    【解决方案2】:

    改代码解决了

            userCurs.execute("SELECT EXISTS(SELECT 1 FROM images WHERE imageLink=?)", (image,))
            exists = userCurs.fetchone()
            if exists[0] == 0:
                addImage(userName,image,'','')
            else:
                print '--------> image skipped'
                print exists
    

    正如人们所说,两次调用 fetchone() 会给出不同的结果,exists 的实际值为 (0,)

    【讨论】:

    • 啊,是的,该行将返回 0 或 1。然后使用 not exists[0]
    【解决方案3】:

    不要再拨打cursor.fetchone()下一个总是为空。重用变量。您正在获取 (0,)(1,) 元组;您可以使用元组赋值来提取标志值(注意exits, = 上的逗号):

    exists, = userCurs.fetchone()
    if not exists:
        addImage(userName, image, '', '')
    else:
        print '--------> image skipped'
        print exists
    

    现在exists 将设置为01,而不是(0,)(1,)if not exists: 测试不会通过0 的情况。

    【讨论】:

    • 我认为这是因为,不存在的情况永远不会执行。由于查询总是返回一行,因此它永远不会被添加到数据库中。
    • 这不是“not exists 案例永远不会执行”的情况 - 请注意,此代码中的 existsfetchone() 返回的元组的第一个成员,而不是元组本身(它引用了原始代码中的元组)。最后一句话澄清了这一点 - 您可以尝试验证您是否有 pyodbc 设置。
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多