我正在尝试存储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?
发布于 2015-05-21 06:00:38
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,但是如果您没有找到正确的位置,您可能会以某种方式说服自己它是正确的。
发布于 2021-03-11 06:48:13
回答在这里,click me
7
当您调用execute时,将计算和获取结果,并使用fetchone/fetchmany/fetchall来检索它们。
在本例中,查询返回单行作为结果,因此在if中调用cursor.fetchone会导致结果被提取并随后被丢弃,因此对fetchone的另一次调用将不会产生任何结果,因为指针已经超出了结果集中的唯一行。
检查数据是否存在的惯用sqlite方法是查询行,并测试其真实性-
发布于 2015-05-21 06:23:16
虽然您可能会看到有效行中的空值列,但我强烈怀疑您没有匹配任何行。您可以通过打印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']))https://stackoverflow.com/questions/30361050
复制相似问题