【问题标题】:Why does fetchone()[0] return a 'Nonetype'为什么 fetchone()[0] 返回“Nonetype”
【发布时间】:2021-03-11 06:48:13
【问题描述】:

我正在尝试存储员工表中的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?

【问题讨论】:

  • 听起来查询没有返回任何数据。检查行数并打印出整个游标结果
  • 我真诚地怀疑它是否有价值Nonetype。可能它有值None,其类型是NoneType,你在一些你没有告诉我们的错误中看到了它。
  • 无论如何,如果数据库中的一列有 SQL 值 NULL,而你在 Python 中 SELECT 它和 fetch 它,你得到的是 None。所以这可能就是您所看到的。
  • @SterlingArcher:这会引​​发IndexError
  • @StefanPochmann:嗯,你必须相信描述的一些部分;否则答案可能只是“Java 1.3 没有ConcurrentSkipListMap,因此您要么需要升级到更高版本,要么获取第三方实现,要么只使用TreeMap,因为您没有使用反正多线程”。 :)

标签: python postgresql


【解决方案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 的值结束,但如果您没有找对地方,您可能会以某种方式说服自己确实如此。

【讨论】:

    【解决方案2】:

    在这里回答,click me

    7

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

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

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

    【讨论】:

      【解决方案3】:

      虽然您可能正在查看有效行中的空值列,但我强烈怀疑您没有匹配任何行。您可以通过打印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']))
      

      【讨论】:

      • OP 没有告诉我们他为 PostgreSQL 使用了哪个 DB-API 库,但他们中的大多数使用 %s 参数样式(或非标准的 $1 参数样式),而不是 @ 987654326@ paramstyle,所以这个答案会让事情变得更糟。
      猜你喜欢
      • 2015-08-18
      • 1970-01-01
      • 2017-02-09
      • 2012-12-01
      • 1970-01-01
      • 2015-06-21
      • 2022-01-23
      • 1970-01-01
      • 2011-03-01
      相关资源
      最近更新 更多