Pregunta

¿Hay una buena práctica para introducir valores clave NULL a una base de datos PostgreSQL cuando una variable es None en Python?

Al ejecutar 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))

resultados en a a excepción TypeError cuando user_id es None.

¿Cómo se puede insertar un NULL en la base de datos cuando un valor es None, utilizando el controlador psycopg2?

¿Fue útil?

Solución

Para insertar valores nulos a la base de datos tiene dos opciones:

  1. omitir ese campo de su sentencia INSERT, o
  2. Uso None

También:. Para evitar una inyección SQL no se debe utilizar la interpolación de cadenas normales para las consultas

Usted debe pasar dos (2) argumentos para execute(), por ejemplo:.

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))

Otros consejos

Con la psycopg actual, en lugar de Ninguno, utilice un conjunto de variables a '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)

Un enfoque más sencillo que también es práctico con un alto número de columnas:

Let row ser una lista de valores para ser insertado que puede contener None. Para insertarlo en PostgreSQL que haga lo siguiente

values = ','.join(["'" + str(i) + "'" if i else 'NULL' for i in row])
cursor.execute('insert into myTable VALUES ({});'.format(values))
conn.commit()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top