我正在尝试检查一个条目是否已经存在于数据库中并添加条目(如果它不是,但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
并且没有对数据库进行任何输入
答案 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
将设置为0
或1
,而不是(0,)
或(1,)
,并且if not exists:
测试将不会通过0
案例。