Pergunta

Existe uma boa prática para entrar NULL Valores -chave para um banco de dados PostgreSQL quando uma variável é None em Python?

Executando esta consulta:

mycursor.execute('INSERT INTO products (user_id, city_id, product_id, quantity, price) VALUES (%i, %i, %i, %i, %f)' %(user_id, city_id, product_id, quantity, price))

resulta em AA TypeError exceção quando user_id é None.

Como pode um NULL ser inserido no banco de dados quando um valor é None, usando o psycopg2 condutor?

Foi útil?

Solução

Para inserir valores nulos no banco de dados, você tem duas opções:

  1. omita esse campo da sua declaração de inserção, ou
  2. usar None

Além disso: para se proteger contra a injeção de SQL, você não deve usar a interpolação normal de string para suas consultas.

Você deve passar dois (2) argumentos para execute(), por exemplo:

mycursor.execute("""INSERT INTO products 
                    (city_id, product_id, quantity, price) 
                    VALUES (%s, %s, %s, %s)""", 
                 (city_id, product_id, quantity, price))

Alternativa #2:

user_id = None
mycursor.execute("""INSERT INTO products 
                    (user_id, city_id, product_id, quantity, price) 
                    VALUES (%s, %s, %s, %s, %s)""", 
                 (user_id, city_id, product_id, quantity, price))

Outras dicas

Com o PsycopG atual, em vez de nenhum, use uma variável definida como 'NULL'.

variable = 'NULL'
insert_query = """insert into my_table values(date'{}',{},{})"""
format_query = insert_query.format('9999-12-31', variable, variable)
curr.execute(format_query)
conn.commit()

>> insert into my_table values(date'9999-12-31',NULL,NULL)

Uma abordagem mais simples que também é prática com o alto número de colunas:

Deixar row ser uma lista de valores a serem inseridos que podem conter None. Para inseri -lo no PostgreSQL, fazemos o seguinte

values = ','.join(["'" + str(i) + "'" if i else 'NULL' for i in row])
cursor.execute('insert into myTable VALUES ({});'.format(values))
conn.commit()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top