我试图从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?
答案 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']))