为什么fetchone()[0]返回一个' Nonetype'

时间:2015-05-20 21:53:45

标签: python postgresql

我试图从employee表中存储employeeid值,以获取特定的行,我在Python上使用以下命令:

cursor.execute("SELECT*FROM EMPLOYEE WHERE first_name = %s AND last_name = %s", (employee['firstname'],employee['lastname']))

接着是

employeeid=cursor.fetchone()[0]

为什么employeeid有值Nonetype?

3 个答案:

答案 0 :(得分:1)

fetchone()[0]返回None的原因几乎可以肯定,与WHERE子句匹配的第一行中的第一列的值为NULL

由于您只是在执行SELECT *而不是提供列列表,因此第一列可以是表中的任何列。如果您特别想要employeeid列,则应SELECT employeeid

此外,由于您没有使用ORDER BY,因此第一行可以是任何匹配的行。因此,请确保没有多行符合您的WHERE子句(除非您希望有这样的行)。您可能有一个值为23的“好”行,另一个值为NULL的“坏”行。

正如StefanPochmann指出的那样,你也可能没有找到任何行,而你却错误地解释了结果。如果查询未返回任何内容,则fetchone()调用将返回None或引发异常。在第一种情况下,您的陈述会导致TypeError: 'NoneType' object is not subscriptable之类的错误,因为cursor.fetchone()[0]实际上正在执行None[0]。在第二种情况下,fetchone本身的异常可能会在某处提及NoneType。在任何情况下,employeeid都不会像您声称的那样以NoneType结尾,但如果您没有找到正确的位置,您可能会以某种方式确信自己是这样。

答案 1 :(得分:0)

在这里回答,click me

7

当您调用 execute 时,计算并获取结果,您使用 fetchone/fetchmany/fetchall 来检索它们。

在您的情况下,您的查询返回单行作为结果,因此在 if 中调用 cursor.fetchone 会导致结果被提取并随后被丢弃,因此对 fetchone 的另一次调用将产生 None 因为指针已经前进越过结果集中唯一的一行。

sqlite惯用的检查数据是否存在的方式,就是查询一行,并测试其真实性-

答案 2 :(得分:-1)

虽然您可能正在查看有效行中的空值列,但我强烈怀疑您没有匹配任何行。您可以通过打印cursor.fetchone()的结果来检查是否匹配了一行。我认为你没有匹配任何行,因为你将参数发送到sql的方式。将它们插入到字符串中,您需要引用字符串参数,如:

cursor.execute("SELECT*FROM EMPLOYEE WHERE first_name = '%s' AND last_name = '%s'", (employee['firstname'],employee['lastname']))

首选选项是将它们作为sql参数传递,如:

stmt = "SELECT * FROM EMPLOYEE WHERE first_name = ? AND last_name = ?"
result = cursor.execute (stmt,(employee['firstname'],employee['lastname']))