2010-11-20 19 views
13

¿Existe una buena práctica para ingresar valores de clave NULL en una base de datos PostgreSQL cuando una variable es None en Python?¿Cómo insertar valores 'NULL' en la base de datos PostgreSQL usando Python?

ejecución de 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)) 

da como resultado una excepción cuando TypeErroruser_id es None.

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

+0

qué adaptador DB-API está utilizando? –

+0

por adaptador DB-API Supongo que te refieres a la interfaz db psycopg2. Si no, ¿puedes ser más específico? – xpanta

Respuesta

27

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

  1. Omitir este campo de su declaración INSERT o
  2. uso None

También: Para protegerse de inyección SQL no debe usar la interpolación de cadenas normal para sus consultas.

Usted debe pasar (2) dos 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)) 
+0

Gracias. ¿Puede señalarme en alguna parte para que pueda leer por qué la interpolación de cadenas en python puede conducir a la inyección sql? Esto es muy interesante y no he pensado en eso. – xpanta

+2

De nada. Esto describe bien qué son los ataques de inyección SQL: http://en.wikipedia.org/wiki/SQL_injection ¿Cómo se relaciona esto con la interpolación de cadenas ?: Digamos que recibe datos que no son de confianza para su programa. Esa entrada podría contener, por ejemplo, un comando 'DROP TABLE'. – bernie

+0

Estoy usando None para el valor de la columna pero obtengo un error: ProgrammingError: la columna "none" no existe LINE 1: ... 01.00-ng20 ', report_date =' 2016-03-30 ', ec_enabled = Ninguno, ec_s ... Aquí está la consulta original que está fallando: ACTUALIZACIÓN kw_daily_data_mart SET nombre_host = 'ctrlkey.com', usuarios_licencia = 7, usuarios licenciados = 10, sw_version = 'kw2016.01.00-ng20', fecha_informe = '2016- 03-30 ', ec_enabled = Ninguno, ec_server_count = 1, config_max_file_version = 10, av_enabled = Verdadero, location_count = 1, sso_enabled = False DONDE customer_id = 127892 AND installation_id = 3585 AND hostname =' ctrlkey.com 'RETURNING id –

Cuestiones relacionadas