Использование NULLIF с ошибкой типа Psycopg2

Я пытаюсь использовать функцию NULLIF, чтобы отфильтровать некоторые пустые записи в команде INSERT INTO через psycopg2.

Проблема в том, что он не будет работать, если столбец ожидает числовое значение, поскольку функция NULLIF, по-видимому, интерпретируется как текст.

Моя таблица содержит 5 столбцов:

cursor.execute(CREATE TABLE myDb.myTable (id serial PRIMARY KEY, name varchar, value_min decimal, value_max decimal, action_name varchar, nb_solutions integer);")

Я вставляю некоторые данные из массива строк, используя:

cursor.executemany("INSERT INTO myDb.myTable (name, value_min, value_max, action_name, nb_solutions) VALUES (%s, %s, %s, NULLIF(%s,'None'), %s)", myArray[1:len(myArray)])

В этом случае NULLIF корректно обрабатывается и вставляет четвертую строку% s из myArray или Null (в зависимости от того, содержит ли массив 'None').

Но когда я пытаюсь применить NULLIF к 5-му столбцу, который является целым числом, NULLIF внезапно интерпретируется как текст:

cursor.executemany("INSERT INTO myDb.myTable (name, value_min, value_max, action_name, nb_solutions) VALUES (%s, %s, %s, %s, NULLIF(%s,'None'))", myArray[1:len(myArray)])

И я получаю следующую ошибку:

ProgrammingError: column "nb_solutions" is of type integer but expression is of type text LINE 1: ...6085', ' 13.077', ' epsi', NULLIF(' 7... ^ HINT: You will need to rewrite or cast the expression. 
  args = ('column "nb_solutions" is of type integer but exp...You will need to rewrite or cast the expression.\n',) 
  cursor = <cursor object at 0x000000000578F3A8; closed: 0> 
  diag = <psycopg2.extensions.Diagnostics object> 
  pgcode = '42804' 
  pgerror = 'ERROR: column "nb_solutions" is of type integer...You will need to rewrite or cast the expression.\n' 
  with_traceback = <built-in method with_traceback of ProgrammingError object> Exported something to DB Mytable

Кто-нибудь знает, почему это происходит?

1 ответ

Обгон запрещен None как 'None' строка. Передать реальное None Значение и Psycopg будет правильно адаптировать его. И приведите его к намеченному типу:

cursor.executemany('''
    INSERT INTO myDb.myTable (
        name, value_min, value_max, action_name, nb_solutions
    ) VALUES (%s, %s, %s, %s, %s::int)
''', myArray[1:len(myArray)])
Другие вопросы по тегам