Como inserir valores 'nulos' no banco de dados PostGresql usando o Python?
-
26-09-2019 - |
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?
Solução
Para inserir valores nulos no banco de dados, você tem duas opções:
- omita esse campo da sua declaração de inserção, ou
- 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()