2013-09-15 3 views
6

Я пытаюсь проверить, существует ли переменная в SQLite3 db. К сожалению, я не могу заставить его работать. Таблица аэропортов содержит 3 колонки, причем ИКАО является первой колонкой.Python проверить, существует ли в SQLite3

if c.execute("SELECT EXISTS(SELECT 1 FROM airports WHERE ICAO='EHAM')") is True: 
    print("Found!") 
else: 
    print("Not found...") 

Код работает без ошибок, но результат всегда тот же (не найден).

Что не так с этим кодом?

ответ

7

Попробуйте вместо этого:

c.execute("SELECT EXISTS(SELECT 1 FROM airports WHERE ICAO='EHAM')") 

if c.fetchone(): 
    print("Found!") 

else: 
    print("Not found...") 

Возврат значение cursor.execute является курсор (или более точная ссылка на себя) и не зависит от результатов запроса. Вы можете легко проверить, что:

>>> r = c.execute("SELECT EXISTS(SELECT 1 FROM airports WHERE ICAO='EHAM')") 
>>> r is True 
False 
>>> r is False 
False 
>>> r is None 
False 

>>> r is c 
True 

С другой стороны, если вы звоните cursor.fetchone результата кортежа или None, если нет строки, которая проходит условие запроса. Так что в вашем случае if c.fetchone(): будет означать одно из ниже:

if (1,): 
    ... 

или

if None: 
    ... 
+0

Это работает! Не могли бы вы объяснить, почему мой метод не работает? – Caesius

+0

Да, я опубликовал обновление с объяснением. – zero323

+0

Это не работает для меня, поскольку EXISTS возвращает 0 или 1 в sqlite3. См. Документы (http://sqlite.org/lang_expr.html): «Оператор EXISTS всегда оценивает одно из целочисленных значений 0 и 1. Если выполнение инструкции SELECT, указанной в качестве правого операнда оператора EXISTS, будет возвращают одну или несколько строк, тогда оператор EXISTS оценивает значение 1. Если выполнение SELECT не будет возвращать никакие строки вообще, то оператор EXISTS будет равен 0. «Таким образом, вы можете изменить ответ с« Нет »на (0). Я отредактирую, если в ближайшие несколько дней никто не станет жертвой. – neuronet

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