"Erro: sintaxe de entrada inválida para inteiro:" ao inserir valores NULL para uma coluna SMALLINT em uma tabela Redshift?

Scott Borden

Eu tenho essa função python definida localmente que funciona bem ao inserir dados em uma tabela redshift:

def _insert_data(table_name, values_list):
    insert_base_sql = f"INSERT INTO {table_name} VALUES"
    insert_sql = insert_base_sql + ','.join([str(row) for row in values_list])
    <run_local_python_code_to_execute_insert_sql>

A values_listé uma lista de tuplos, cada um com o mesmo número de elementos como colunas em table_name(embora não explicitamente fazer valer / verificação de que nesta função). No entanto, não estou conseguindo encontrar uma maneira de inserir um NULLvalor para uma smallintcoluna. Este é o esquema para a tabela em questão (nenhum DEFAULTvalor foi atribuído às colunas na criação da tabela):

 schemaname |      tablename      |    column    |         type          | encoding | distkey | sortkey | notnull
------------+---------------------+--------------+-----------------------+----------+---------+---------+---------
 public     | table               | col1         | bigint                | lzo      | t       |       1 | f
 public     | table               | col2         | date                  | lzo      | f       |       2 | f
 public     | table               | col3         | smallint              | lzo      | f       |       3 | f
 public     | table               | col4         | smallint              | lzo      | f       |       4 | f
 public     | table               | col5         | double precision      | none     | f       |       0 | f
 public     | table               | col6         | bigint                | lzo      | f       |       0 | f
 public     | table               | col7         | character varying(48) | bytedict | f       |       0 | f

Estou especificamente tentando inserir NULLvalores para col3e col4; Eu tentei tuplas criando com ''e 'NULL'mas executar para esse erro: Error: invalid input syntax for integer: "NULL".

Para valer a pena, veja como uma linha limpa acaba ficando na INSERTinstrução:('bigint_value', 'dt_value', 'NULL', 'NULL', 'double_value', 'bigint_value', 'string_name')

Alecxe

A abordagem que você está adotando é bastante perigosa por si só. A construção de consultas usando concatenação e formatação de strings é propensa a erros e não é segura - você está tornando sua consulta vulnerável a ataques de injeção SQL .

Em vez disso, parametrize corretamente sua consulta, passando uma lista de parâmetros como um argumento separado para o cursor.executemany(). Esta é uma maneira não muito bonita de gerar marcadores de posição:

placeholders = ", ".join(["%s"] * len(values_list))
query = f"""
    INSERT INTO 
        {table_name} 
    VALUES
        ({placeholders})
"""
cursor.executemany(query, values_list)

(observe que o nome da tabela não pode ser parametrizado - higienize e valide-o separadamente)

Observe o uso de executemany()- ele executaria uma instrução de consulta preparada para cada tupla no values_list.

Mas, se você estiver usando psycopg2, há uma maneira ainda melhor de inserir vários registros na tabela execute_values()- dê uma olhada nesta resposta .

E, voltando à sua pergunta inicial - se você seguir essa abordagem, os Nonevalores de espaço reservado seriam automaticamente convertidos em 'NULL'strings pelo driver do banco de dados .

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  5. 5

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  6. 6

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  16. 16

    How to create dynamic navigation menu select from database using Codeigniter?

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo