2015-05-20 3 views
1

Я пытаюсь сохранить значение EmployeeID из таблицы сотрудников, чтобы получить конкретную строку я использую следующую команду на Python:Почему fetchone() [0] возвращает «Nonetype»

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

с последующей от

employeeid=cursor.fetchone()[0] 

Почему у работника есть значение Nonetype?

+2

Похоже, запрос не возвращает никаких данных , Проверьте rowcount и распечатайте все результаты курсора –

+1

Я искренне сомневаюсь, что он имеет значение 'Nonetype'. Вероятно, он имеет значение 'None', тип которого -' NoneType', который вы видели в некоторой ошибке, которую вы нам не показывали. – abarnert

+0

Во всяком случае, если столбец в базе данных имеет значение SQL 'NULL', а вы' SELECT' его и 'fetch' в Python, то вы получаете' None'. Так что это, вероятно, то, что вы видите. – abarnert

ответ

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

Хотя вы можете смотреть столбцы с нулевым значением в допустимой строке, я сильно подозреваю, что вы не соответствовали строкам. Вы можете проверить соответствие строки, распечатав результаты вашего 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'])) 
+0

OP не сообщил нам, какую библиотеку DB-API он использует для PostgreSQL, но большинство из них использует параметр '% s' paramstyle (или нестандартный' $ 1' paramstyle), а не '' 'paramstyle, так что этот ответ будет еще хуже. – abarnert

Смежные вопросы