即使条件满足,Python if语句也会跳过代码

时间:2015-05-02 08:32:59

标签: python-2.7 if-statement

我正在尝试检查一个条目是否已经存在于数据库中并添加条目(如果它不是,但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

并且没有对数据库进行任何输入

3 个答案:

答案 0 :(得分:3)

SQL语句:

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

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

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

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

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

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

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

答案 1 :(得分:1)

通过将代码更改为

解决了这个问题
        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,)

答案 2 :(得分:0)

请勿再次致电cursor.fetchone(); next 总是为空。重用变量。您正在获取(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案例。