Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么fetchone()[0]返回“非类型”_Python_Postgresql - Fatal编程技术网

Python 为什么fetchone()[0]返回“非类型”

Python 为什么fetchone()[0]返回“非类型”,python,postgresql,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 fetchone[0]返

我试图存储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

fetchone[0]返回None的原因几乎可以肯定是,与WHERE子句匹配的第一行中的第一列具有空值

因为您只是执行SELECT*而不是提供列列表,所以第一列可以是表中的任何列。如果特别需要employeeid列,则应选择employeeid

另外,由于没有使用ORDERBY,第一行可以是任何匹配的行。因此,确保没有多行匹配WHERE子句,除非您预期会有。您可能有一个值为23的好行,另一个值为NULL的坏行


正如StefanPochmann指出的,也有可能您没有找到任何行,并且您误解了结果。如果查询不返回任何内容,fetchone调用将要么不返回任何内容,要么引发异常。在第一种情况下,您的语句将导致类似TypeError的错误:“NoneType”对象不可下标,因为cursor.fetchone[0]实际上不执行任何[0]。在第二种情况下,fetchone本身的异常可能会在某个地方提到NoneType。在这两种情况下,employeeid都不会像您所说的那样以值NoneType结尾,但是如果您没有在正确的位置查找,您可能会以某种方式确信它是正确的。

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

cursor.execute("SELECT*FROM EMPLOYEE WHERE first_name = '%s' AND last_name = '%s'", (employee['firstname'],employee['lastname']))
stmt = "SELECT * FROM EMPLOYEE WHERE first_name = ? AND last_name = ?"
result = cursor.execute (stmt,(employee['firstname'],employee['lastname']))
首选选项是将它们作为sql参数传入,如:

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

七,

调用execute时,将计算并获取结果,并使用fetchone/fetchmany/fetchall检索结果

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


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

听起来查询没有返回任何数据。检查rowcount并打印出整个游标结果,我真诚地怀疑它是否有值Nonetype。可能它的值为None,其类型为NoneType,您在一些错误中看到了这一点,但没有显示给我们。无论如何,如果数据库中的某个列的SQL值为NULL,您选择它并在Python中获取它,那么您得到的是None。所以这可能就是你所看到的。@SterlingArcher:那会引起一个索引器。@StefanPochmann:嗯,你必须相信描述的某些部分;否则,答案可能是Java 1.3没有ConcurrentSkipListMap,因此您需要升级到更高版本,或者获得第三方实现,或者只使用TreeMap,因为您根本不使用多线程:OP没有告诉我们他在PostgreSQL中使用的是哪一个DB-API库,但大多数都使用%s paramstyle或非标准$1 paramstyle,而不是?所以这个答案会让事情变得更糟。