2015-09-09 1 views
2

Я использую библиотеку psycopg2 в python, и запрос INSERT работает хорошо, когда я вставляю значение null с None, но когда я хочу сделать SELECT, нулевые значения с None не возвращают.Как найти нулевые значения с помощью запроса SELECT в psycopg?

cur.execute("SELECT id FROM registro WHERE id_movil = (%s);", (None,)) 

Этот запрос не возвращает ни одного ряда, я не знаю, где ошибка.

Кто-нибудь знает, как сделать SELECT запрос, чтобы найти нулевые значения в БД?

ответ

3

Первое, что нужно сделать, это выяснить, какие запросы он превращая вашу команду в:

print(cur.mogrify("SELECT id FROM registro WHERE id_movil = (%s);", (None,))) 

Если что дает ничего, кроме IS NULL проверки codition, он не будет получать NULLs из таблицы.

В частности, если вы видите фразу = NULL, вы будете знать, что это не переводится правильно (1), и вы должны сделать что-то вроде:

if var is None: 
    cur.execute("SELECT id FROM registro WHERE id_movil IS NULL;") 
else: 
    cur.execute("SELECT id FROM registro WHERE id_movil = (%s);", (var,)) 

Или, если вы знаете, «повторно всегда ищет NULL значений (как ваше использование постоянного None, кажется, указывает), просто используйте:

cur.execute("SELECT id FROM registro WHERE id_movil IS NULL;") 

(1) Вполне возможно, что только %s заменяется NULL, когда аргумент None, и это не совсем достаточно умен, чтобы вернуться назад и изменить = в IS (или <> в IS NOT).

Это могло бы объяснить, почему это работает:

cur.execute("INSERT into mytbl value (%s);", (None,)) 

(потому что замена только%s дает команду, которую вы хотите), но ничего с = NULL не будет действовать, как и следовало ожидать, если вы не были сожжены им достаточно времени до знаю что ожидать :-).

+0

Спасибо !!! Это работает! И если я хочу сделать двойное условие где?Например id_movil IS NULL и name = xxx? Например: –

+0

@Telmo, предполагая, что 'xxx' не является None, вы можете использовать что-то вроде' cur.execute («SELECT id FROM registro WHERE id_movil IS NULL и name = (% s);», ('xxx',)) ' – paxdiablo

+0

Спасибо большое @paxdiablo !! Оно работает! –

0

Там в другой синтаксис для проверки что-то, является ли NULL -значная:

cur.execute("SELECT id FROM registro WHERE id_movil IS NULL;") 

То же самое относится и к получать все, что не NULL:

cur.execute("SELECT id FROM registro WHERE id_movil IS NOT NULL;") 

EDIT:

Вы можете комбинировать предложения WHERE, используя AND так же, как вы обычно:

cur.execute(
    "SELECT id FROM registro WHERE id_movil IS NULL AND name = (%s);", 
    ('Bob',) 
) 
+0

Спасибо! Это работает!! И если я хочу сделать двойное условие где? Например id_movil IS NULL и name = xxx? –

+0

Спасибо! Оно работает!! ;) –

1

Попробуйте

cur.execute("SELECT id FROM registro WHERE (id_movil = (%s) or id_movil is null);", (movil,)) 
Смежные вопросы